Bash trap 명령어

LinuxBeginner
지금 연습하기

소개

이 실습에서는 Bash 스크립팅의 trap 명령어를 살펴봅니다. trap 명령어는 스크립트 실행 중에 발생하는 신호 (Signal), 중단 및 사용자 입력을 포착하고 처리할 수 있게 해주는 강력한 도구입니다. trap을 사용하면 특정 신호를 받았을 때 수행할 동작을 정의할 수 있어, 예기치 않은 동작을 관리하고 다양한 상황에 유연하게 대처할 수 있습니다. 이 실습은 초보자를 위해 설계되었으며, trap 명령어를 효과적으로 사용하는 과정을 단계별로 안내합니다.

Bash 스크립트 생성하기

먼저 trap 명령어를 구현할 새로운 Bash 스크립트 파일을 만드는 것부터 시작해 보겠습니다.

  1. WebIDE 에서 터미널을 엽니다. $ 기호로 끝나는 프롬프트가 보일 것입니다.

  2. 프로젝트 디렉토리로 이동합니다.

    cd ~/project
    

    이 명령어는 현재 작업 디렉토리를 /home/labex/project로 변경합니다.

  3. trap_example.sh라는 이름의 새 파일을 생성합니다.

    touch trap_example.sh
    

    touch 명령어는 파일이 존재하지 않으면 빈 파일을 생성하고, 이미 존재하면 수정 시간을 업데이트합니다.

  4. WebIDE 에디터에서 trap_example.sh 파일을 엽니다. 왼쪽 파일 탐색기에서 파일 이름을 클릭하여 열 수 있습니다.

기본적인 trap 명령어 구현하기

이제 특정 신호를 포착하여 안전하게 종료할 수 있도록 스크립트에 기본적인 trap 명령어를 구현해 보겠습니다.

  1. trap_example.sh 파일에 다음 내용을 작성합니다.

    #!/bin/bash
    
    cleanup_and_exit() {
      echo -e "\nSignal received! Cleaning up and exiting..."
      exit 0
    }
    
    trap cleanup_and_exit SIGINT SIGTERM
    
    echo "This script will run until you press Ctrl+C."
    echo "Press Ctrl+C to see the trap in action and exit gracefully."
    
    count=1
    while true; do
      echo "Script is running... (iteration $count)"
      sleep 1
      ((count++))
    done
    

    스크립트의 주요 내용을 살펴보겠습니다.

    • 첫 번째 줄의 #!/bin/bash는 쉬뱅 (shebang) 이라고 불립니다. 시스템에 이 스크립트를 Bash 쉘로 실행하도록 지시합니다.
    • 메시지를 출력하고 스크립트를 종료하는 cleanup_and_exit 함수를 정의했습니다.
    • trap 명령어는 SIGINT(중단) 또는 SIGTERM(종료) 신호를 포착했을 때 cleanup_and_exit 함수를 호출하도록 설정되었습니다. SIGINT 는 보통 사용자가 Ctrl+C 를 누를 때 전송되며, SIGTERM 은 프로세스에 정상적인 종료를 요청할 때 자주 사용됩니다.
    • echo 명령어는 사용자에게 안내 메시지를 출력합니다.
    • while 루프는 무한히 실행되며, 1 초마다 메시지를 출력하고 카운터를 증가시킵니다.
  2. 내용을 작성한 후 파일을 저장합니다.

스크립트 실행 권한 부여 및 실행하기

스크립트를 실행하기 전에 실행 권한을 부여해야 합니다. 이는 시스템에 이 파일을 프로그램으로 실행할 수 있음을 알려주는 단계입니다.

  1. 터미널에서 스크립트에 실행 권한을 부여합니다.

    chmod +x ~/project/trap_example.sh
    

    chmod 명령어는 파일의 권한을 변경합니다. +x 옵션은 실행 권한을 추가합니다.

  2. 스크립트를 실행합니다.

    ~/project/trap_example.sh
    

    이 명령어는 Bash 가 우리가 만든 스크립트를 실행하도록 합니다.

  3. 스크립트가 실행되기 시작하면 화면에 안내 메시지가 나타납니다. 몇 초 동안 그대로 둡니다.

  4. 이제 Ctrl+C 를 눌러 실행을 중단합니다. 스크립트가 종료되기 전에 "Signal received!"라는 메시지가 나타나는 것을 확인할 수 있습니다. 이것이 바로 우리가 설정한 trap 이 작동하는 모습입니다!

함수를 사용하도록 trap 수정하기

단순한 함수 대신, trap 명령어와 함께 더 복잡한 동작을 수행하는 함수를 사용하도록 스크립트를 수정해 보겠습니다. 이를 통해 신호를 받았을 때 더 상세한 작업을 수행할 수 있습니다.

  1. WebIDE 에디터에서 trap_example.sh 파일을 엽니다.

  2. 파일의 내용을 다음과 같이 교체합니다.

    #!/bin/bash
    
    cleanup_and_exit() {
      echo -e "\nSignal received! Cleaning up..."
      echo "Performing cleanup tasks..."
      ## Add any necessary cleanup code here
      echo "Cleanup completed."
      echo "Exiting script gracefully."
      exit 0
    }
    
    trap cleanup_and_exit SIGINT SIGTERM
    
    echo "This script will run until you press Ctrl+C."
    echo "Press Ctrl+C to see the trap function in action and exit gracefully."
    
    count=1
    while true; do
      echo "Script is running... (iteration $count)"
      sleep 1
      ((count++))
    done
    

    변경된 부분을 살펴보겠습니다.

    • cleanup_and_exit 함수를 확장하여 더 상세한 메시지와 정리 작업 (cleanup tasks) 을 위한 자리를 마련했습니다.
    • 이제 이 함수는 파일 핸들 닫기, 임시 파일 삭제 또는 리소스 해제와 같은 실제적인 정리 과정을 시뮬레이션합니다.
    • 메인 루프에 반복 횟수 (iteration count) 를 표시하여 스크립트가 활발히 작동 중임을 더 명확하게 보여줍니다.
  3. 변경 사항을 저장합니다.

  4. 스크립트를 다시 실행하고 Ctrl+C 를 눌러 테스트합니다.

    ~/project/trap_example.sh
    

    스크립트를 중단할 때 cleanup_and_exit 함수에서 출력하는 새로운 메시지들을 볼 수 있으며, 이를 통해 프로그램이 안전하게 종료되는 과정을 확인할 수 있습니다.

요약

이 실습에서는 Bash 스크립팅에서 trap 명령어를 사용하는 방법을 배웠습니다. 특정 신호를 포착하고 해당 신호가 수신되었을 때 수행할 동작을 정의하는 스크립트를 작성해 보았습니다. 또한 인라인 명령어와 함수를 사용하는 등 trap 명령어를 활용하는 다양한 방식을 살펴보았습니다.

trap 명령어는 Bash 스크립트에서 중단 상황을 처리하고 정리 작업을 수행하는 데 매우 유용한 도구입니다. 이를 통해 예기치 않은 종료나 사용자의 중단 요청을 유연하게 처리함으로써, 더욱 견고하고 사용자 친화적인 명령줄 애플리케이션을 제작할 수 있습니다.

신호 처리 능력은 임시 파일의 적절한 삭제, 네트워크 연결 종료, 또는 스크립트가 갑자기 종료되기 전의 상태 저장 등 많은 스크립팅 시나리오에서 매우 중요하게 활용됩니다.