Bash trap 명령어

LinuxBeginner
지금 연습하기

소개

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

이 과정은 단계별 지침을 통해 학습과 실습을 돕는 가이드형 실습입니다. 각 단계를 주의 깊게 따라하며 직접 경험을 쌓아보세요. 통계에 따르면 이 실습은 입문 단계 수준으로 99%의 수료율을 기록하고 있으며, 학습자들로부터 100%의 긍정적인 평가를 받았습니다.

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

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