まず、を設定するために2番目のスレッドが必要かどうかはわかりません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
に 4 回繰り返して送信しkill $(ps aux | grep signals-test | awk '/python/ {print $2}')
ます。
$ ./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