소개
이 실습에서는 Bash 스크립팅의 trap 명령어를 살펴봅니다. trap 명령어는 스크립트 실행 중에 발생하는 신호 (Signal), 중단 및 사용자 입력을 포착하고 처리할 수 있게 해주는 강력한 도구입니다. trap을 사용하면 특정 신호를 받았을 때 수행할 동작을 정의할 수 있어, 예기치 않은 동작을 관리하고 다양한 상황에 유연하게 대처할 수 있습니다. 이 실습은 초보자를 위해 설계되었으며, trap 명령어를 효과적으로 사용하는 과정을 단계별로 안내합니다.
Bash 스크립트 생성하기
먼저 trap 명령어를 구현할 새로운 Bash 스크립트 파일을 만드는 것부터 시작해 보겠습니다.
WebIDE 에서 터미널을 엽니다.
$기호로 끝나는 프롬프트가 보일 것입니다.프로젝트 디렉토리로 이동합니다.
cd ~/project이 명령어는 현재 작업 디렉토리를
/home/labex/project로 변경합니다.trap_example.sh라는 이름의 새 파일을 생성합니다.touch trap_example.shtouch명령어는 파일이 존재하지 않으면 빈 파일을 생성하고, 이미 존재하면 수정 시간을 업데이트합니다.WebIDE 에디터에서
trap_example.sh파일을 엽니다. 왼쪽 파일 탐색기에서 파일 이름을 클릭하여 열 수 있습니다.
기본적인 trap 명령어 구현하기
이제 특정 신호를 포착하여 안전하게 종료할 수 있도록 스크립트에 기본적인 trap 명령어를 구현해 보겠습니다.
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 초마다 메시지를 출력하고 카운터를 증가시킵니다.
- 첫 번째 줄의
내용을 작성한 후 파일을 저장합니다.
스크립트 실행 권한 부여 및 실행하기
스크립트를 실행하기 전에 실행 권한을 부여해야 합니다. 이는 시스템에 이 파일을 프로그램으로 실행할 수 있음을 알려주는 단계입니다.
터미널에서 스크립트에 실행 권한을 부여합니다.
chmod +x ~/project/trap_example.shchmod명령어는 파일의 권한을 변경합니다.+x옵션은 실행 권한을 추가합니다.스크립트를 실행합니다.
~/project/trap_example.sh이 명령어는 Bash 가 우리가 만든 스크립트를 실행하도록 합니다.
스크립트가 실행되기 시작하면 화면에 안내 메시지가 나타납니다. 몇 초 동안 그대로 둡니다.
이제 Ctrl+C 를 눌러 실행을 중단합니다. 스크립트가 종료되기 전에 "Signal received!"라는 메시지가 나타나는 것을 확인할 수 있습니다. 이것이 바로 우리가 설정한 trap 이 작동하는 모습입니다!
함수를 사용하도록 trap 수정하기
단순한 함수 대신, trap 명령어와 함께 더 복잡한 동작을 수행하는 함수를 사용하도록 스크립트를 수정해 보겠습니다. 이를 통해 신호를 받았을 때 더 상세한 작업을 수행할 수 있습니다.
WebIDE 에디터에서
trap_example.sh파일을 엽니다.파일의 내용을 다음과 같이 교체합니다.
#!/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) 를 표시하여 스크립트가 활발히 작동 중임을 더 명확하게 보여줍니다.
변경 사항을 저장합니다.
스크립트를 다시 실행하고 Ctrl+C 를 눌러 테스트합니다.
~/project/trap_example.sh스크립트를 중단할 때
cleanup_and_exit함수에서 출력하는 새로운 메시지들을 볼 수 있으며, 이를 통해 프로그램이 안전하게 종료되는 과정을 확인할 수 있습니다.
요약
이 실습에서는 Bash 스크립팅에서 trap 명령어를 사용하는 방법을 배웠습니다. 특정 신호를 포착하고 해당 신호가 수신되었을 때 수행할 동작을 정의하는 스크립트를 작성해 보았습니다. 또한 인라인 명령어와 함수를 사용하는 등 trap 명령어를 활용하는 다양한 방식을 살펴보았습니다.
trap 명령어는 Bash 스크립트에서 중단 상황을 처리하고 정리 작업을 수행하는 데 매우 유용한 도구입니다. 이를 통해 예기치 않은 종료나 사용자의 중단 요청을 유연하게 처리함으로써, 더욱 견고하고 사용자 친화적인 명령줄 애플리케이션을 제작할 수 있습니다.
신호 처리 능력은 임시 파일의 적절한 삭제, 네트워크 연결 종료, 또는 스크립트가 갑자기 종료되기 전의 상태 저장 등 많은 스크립팅 시나리오에서 매우 중요하게 활용됩니다.



