まず、を設定するために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
signalfd
配信を使用してマスクすることで、以前に求めていたことをSIGTERM
実行しました。