Job Control

때때로 실행되는 동안에 수행 중인 job을 중단해야하는 경우가 있다.

명령어를 실행했는데 너무 오래 걸리는 경우엔 Ctrl-C가 만사형통이긴 하다만,

이게 내부적으론 어떻게 실행되는 거고 왜 가끔은 실패하는거지? 🧐

killing a process

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로 중단해보려 한 결과는 아래에!

Screen Shot 2022-09-30 at 9.12.37 PM.png

보다시피 ctrl-c로 중단되지 않는다. 중단하려면 ctrl-\\(SIGQUIT)

SIGINTSIGQUIT 둘 다 터미널 관련된 요청을 처리하긴 하지만, 프로세스를 종료하기 위한 더 일반적인 방법은 SIGTERM 신호이다.