때때로 실행되는 동안에 수행 중인 job을 중단해야하는 경우가 있다.
명령어를 실행했는데 너무 오래 걸리는 경우엔 Ctrl-C
가 만사형통이긴 하다만,
이게 내부적으론 어떻게 실행되는 거고 왜 가끔은 실패하는거지? 🧐
shell은 프로세스간의 정보를 전달하기 위해 Signal
이라는 unix 메커니즘을 사용한다.
프로세스가 시그널을 받으면 프로세스의 진행을 잠시 멈추고 시그널을 처리한다.
이 처리 결과에 따라 프로세스의 실행 흐름이 달라질 수 있다.
따라서 시그널은 소프트웨어 인터럽트
이다.
import signal, time
def handler(signum, time):
print("\\nI got a SIGINT, but I am not stopping")
signal.signal(signal.SIGINT, handler)
i = 0
while True:
time.sleep(.1)
print("\\r{}".format(i))
i += 1
Ctrl-C
는 프로세스에 SIGINT
를 전달한다.
위 예제 코드는 SIGINT를 무시하는 프로그램이며 실행 후 ctrl-c로 중단해보려 한 결과는 아래에!
보다시피 ctrl-c
로 중단되지 않는다. 중단하려면 ctrl-\\(SIGQUIT)
SIGINT
와 SIGQUIT
둘 다 터미널 관련된 요청을 처리하긴 하지만, 프로세스를 종료하기 위한 더 일반적인 방법은 SIGTERM
신호이다.