Unix / Linux - Signals and Traps
안녕하세요, 미래의 컴퓨터 마법사 여러분! 오늘 우리는 Unix/Linux 시그널과 트랩의 fascineting 세계로 창을 열어보겠습니다. 프로그래밍에 처음이라면 걱정 마세요 - 저는 여러분을 이 모험을 단계별로 안내해 드릴 것입니다. 수년 동안 수많은 학생들을 가르쳐온 경험을 바탕으로 말이죠. 그럼 이 흥미로운 여정을 함께 시작해보겠습니다!
What are Signals?
치고부熙한 레스토랑 주방을 상상해 보세요. 주방장( Unix 셰프라고 부를게요)은 자신의 직원들과 빠르게 소통해야 합니다. 소리를 지르는 대신 손 신호를 사용합니다. Unix/Linux 세계에서 시그널이 바로 그런 것입니다 - 프로세스 간의 빠르고 효율적인 소통 방법입니다.
시그널은 프로그램에 중요한 이벤트가 발생했음을 알리기 위해 보내는 소프트웨어 인터럽트입니다. 이러한 이벤트는 사용자 요청에서부터 예외적인 런타임 발생에 이르기까지 다양합니다.
List of Signals
Chef Unix가 "salt 더해줘", "빨리 해", " 쉬어"와 같은 다른 손 신호를 가질 수 있듯이, Unix/Linux 시스템은 다양한 목적을 위한 다양한 시그널을 가지고 있습니다. 가장 일반적인 몇 가지를 살펴보겠습니다:
Signal Name | Signal Number | Description |
---|---|---|
SIGHUP | 1 | 컨트롤링 터미널에서 hangup 감지되거나 컨트롤링 프로세스가 죽었을 때 |
SIGINT | 2 | 키보드에서의 인터럽트 (Ctrl+C) |
SIGQUIT | 3 | 키보드에서의 quite (Ctrl+) |
SIGKILL | 9 | Kill 시그널 (캐치하거나 무시할 수 없음) |
SIGTERM | 15 | 종료 시그널 |
SIGSTOP | 17, 19, 23 | 프로세스 중지 (캐치하거나 무시할 수 없음) |
Default Actions
프로세스에 시그널이 보내지면, 지정된 행동을 하지 않는 한 기본 행동을 취합니다. 이 기본 행동은 우리 주방 직원들의本能적 반응과 같습니다. 예를 들어:
- 프로세스 종료
- 시그널 무시
- 코어 덤프
- 프로세스 중지
- 중지된 프로세스 계속
Sending Signals
이제 이러한 시그널을 보내는 방법을 배워보겠습니다. Unix/Linux에서는 kill
명령어를 사용하여 프로세스에 시그널을 보냅니다. kill
이라는 이름에 혼동되지 마세요 - kill
은 항상 프로세스를 종료시키는 것이 아니라, 시그널을 보내는 방법입니다.
다음과 같이 사용할 수 있습니다:
kill -signal_name process_id
예를 들어, 프로세스 1234에 SIGTERM 시그널을 보내기 위해:
kill -SIGTERM 1234
또는 시그널 번호를 사용하여:
kill -15 1234
Trapping Signals
우리 주방 직원들이 Chef Unix의 시그널에 대해 항상 기본 반응을 따르지 않고, 대신 어떻게 반응할지 결정할 수 있다면 어떨까요? 이는 프로그래밍에서 시그널 트래핑이 허용하는 것입니다.
셸 스크립트에서는 trap
명령어를 사용하여 시그널을 캐치하고, 수신 시 어떤 작업을 수행할지 지정합니다. 기본 문법은 다음과 같습니다:
trap command signal(s)
예제를 보겠습니다:
#!/bin/bash
trap "echo Bonjour!" SIGINT SIGTERM
echo "It's a trap!"
while true
do
sleep 60
done
이 스크립트는 SIGINT 또는 SIGTERM을 수신할 때 "Bonjour!"를 출력합니다. 주방 직원들에게 "셰프가 멈추는 신호를 보낼 때 'Bonjour!'라고 말하라"는 것과 같습니다.
Cleaning Up Temporary Files
트랩의 일반적인 사용 사례 중 하나는 스크립트가 종료하기 전에 일시 파일을 정리하는 것입니다. 다음은 예제입니다:
#!/bin/bash
# 일시 파일 생성
temp_file=$(mktemp)
# 일시 파일을 종료 시 제거하는 트랩 설정
trap "rm -f $temp_file" EXIT
# 일시 파일 사용
echo "Hello, World!" > $temp_file
cat $temp_file
# 스크립트가 종료될 때 일시 파일이 자동으로 제거됩니다
이 스크립트는 일시 파일을 생성하고, 그 파일에 쓰고, 읽고, 스크립트가 종료될 때 자동으로 제거합니다.
Ignoring Signals
occasionally, you might want to ignore certain signals. In our kitchen analogy, this would be like telling a chef, "No matter how many times you signal for more salt, I'm not adding any more!"
다음과 같이 시그널을 무시할 수 있습니다:
trap "" SIGINT
이 명령은 스크립트가 SIGINT 시그널을 수신할 때 아무 작업도 수행하지 않도록 합니다.
Resetting Traps
트랩을 설정한 후 기본 행동으로 되돌리려면 어떻게 하나요? 트랩을 다음과 같이 재설정할 수 있습니다:
trap - SIGINT
이 명령은 SIGINT 트랩을 제거하고 기본 행동으로 되돌립니다.
다음은 더 완전한 예제입니다:
#!/bin/bash
# 초기 트랩 설정
trap "echo You can't stop me!" SIGINT
echo "Try to stop me with Ctrl+C..."
sleep 10
# 트랩 재설정
trap - SIGINT
echo "Okay, now you can stop me with Ctrl+C..."
sleep 10
echo "If you see this, you didn't stop me!"
이 스크립트는 최초에 SIGINT를 트랩하고, 10초 후에 트랩을 재설정합니다. 주방 직원들에게 "10초 동안 멈추는 신호를 무시하고, 그 후에는 다시 정상으로 돌아가라"는 것과 같습니다.
그럼 여러분, Unix/Linux 시그널과 트랩의 세계를 여행했습니다. 연습이 완벽을 만듭니다. 자신만의 스크립트를 작성하고, 다양한 시그널을 실험해 보세요. 곧 진정한 마에스트로가 되실 것입니다. 즐거운 코딩을!
Credits: Image by storyset