먼저,를 설정하기 위해 두 번째 스레드가 필요한지 확실하지 않습니다 shutdown_flag
.
왜 SIGTERM 핸들러에서 직접 설정하지 않습니까?
대안은 SIGTERM
처리기 에서 예외를 발생 시켜 스택으로 전파되는 것입니다. 적절한 예외 처리가 있다고 가정합니다 (예 : with
/ contextmanager
및try: ... finally:
블록)Ctrl+C 프로그램 을 사용하는 경우와 마찬가지로 상당히 정상적으로 종료 해야합니다.
프로그램 예 signals-test.py
:
#!/usr/bin/python
from time import sleep
import signal
import sys
def sigterm_handler(_signo, _stack_frame):
# Raises SystemExit(0):
sys.exit(0)
if sys.argv[1] == "handle_signal":
signal.signal(signal.SIGTERM, sigterm_handler)
try:
print "Hello"
i = 0
while True:
i += 1
print "Iteration #%i" % i
sleep(1)
finally:
print "Goodbye"
이제 Ctrl+C행동을보십시오 :
$ ./signals-test.py default
Hello
Iteration #1
Iteration #2
Iteration #3
Iteration #4
^CGoodbye
Traceback (most recent call last):
File "./signals-test.py", line 21, in <module>
sleep(1)
KeyboardInterrupt
$ echo $?
1
이번에 SIGTERM
는 kill $(ps aux | grep signals-test | awk '/python/ {print $2}')
다음 과 같이 4 번 반복하여 보냅니다 .
$ ./signals-test.py default
Hello
Iteration #1
Iteration #2
Iteration #3
Iteration #4
Terminated
$ echo $?
143
이번에는 사용자 정의 SIGTERM
처리기를 활성화 하여 보냅니다 SIGTERM
.
$ ./signals-test.py handle_signal
Hello
Iteration #1
Iteration #2
Iteration #3
Iteration #4
Goodbye
$ echo $?
0
signalfd
전달을 사용 하고 숨겨서 이전에 요청한 것을SIGTERM
수행했습니다.