Linux の python 2.6 では、以下を使用して TERM シグナルを処理できます。
import signal
def handleSigTERM():
shutdown()
signal.signal(signal.SIGTERM, handleSigTERM)
一度に1つずつ設定する以外に、プロセスによって受信されたすべてのシグナルのハンドラーを設定する方法はありますか?
Linux の python 2.6 では、以下を使用して TERM シグナルを処理できます。
import signal
def handleSigTERM():
shutdown()
signal.signal(signal.SIGTERM, handleSigTERM)
一度に1つずつ設定する以外に、プロセスによって受信されたすべてのシグナルのハンドラーを設定する方法はありますか?
シグナルモジュールのシグナルをループしてセットアップするだけです。
for i in [x for x in dir(signal) if x.startswith("SIG")]:
try:
signum = getattr(signal,i)
signal.signal(signum,sighandler)
except (OSError, RuntimeError) as m: #OSError for Python3, RuntimeError for 2
print ("Skipping {}".format(i))
try を取り除きたい場合は、キャッチできないシグナルを無視してください。
#!/usr/bin/env python
# https://stackoverflow.com/questions/2148888/python-trap-all-signals
import os
import sys
import time
import signal
SIGNALS_TO_NAMES_DICT = dict((getattr(signal, n), n) \
for n in dir(signal) if n.startswith('SIG') and '_' not in n )
def receive_signal(signum, stack):
if signum in [1,2,3,15]:
print 'Caught signal %s (%s), exiting.' % (SIGNALS_TO_NAMES_DICT[signum], str(signum))
sys.exit()
else:
print 'Caught signal %s (%s), ignoring.' % (SIGNALS_TO_NAMES_DICT[signum], str(signum))
def main():
uncatchable = ['SIG_DFL','SIGSTOP','SIGKILL']
for i in [x for x in dir(signal) if x.startswith("SIG")]:
if not i in uncatchable:
signum = getattr(signal,i)
signal.signal(signum,receive_signal)
print('My PID: %s' % os.getpid())
while True:
time.sleep(1)
main()
そのコードは、現在のバージョンの python では機能しません。同じ値を持つ SIG で始まる多くの変数があります。たとえば、SIGHUP と SIG_UNBLOCK はどちらも 1 です。実際のシグナルのリストを取得するために考えられる唯一の方法は、自分で作成することでした。
from signal import *
signals = {
SIGABRT: 'SIGABRT',
SIGALRM: 'SIGALRM',
SIGBUS: 'SIGBUS',
SIGCHLD: 'SIGCHLD',
SIGCONT: 'SIGCONT',
SIGFPE: 'SIGFPE',
SIGHUP: 'SIGHUP',
SIGILL: 'SIGILL',
SIGINT: 'SIGINT',
SIGPIPE: 'SIGPIPE',
SIGPOLL: 'SIGPOLL',
SIGPROF: 'SIGPROF',
SIGQUIT: 'SIGQUIT',
SIGSEGV: 'SIGSEGV',
SIGSYS: 'SIGSYS',
SIGTERM: 'SIGTERM',
SIGTRAP: 'SIGTRAP',
SIGTSTP: 'SIGTSTP',
SIGTTIN: 'SIGTTIN',
SIGTTOU: 'SIGTTOU',
SIGURG: 'SIGURG',
SIGUSR1: 'SIGUSR1',
SIGUSR2: 'SIGUSR2',
SIGVTALRM: 'SIGVTALRM',
SIGXCPU: 'SIGXCPU',
SIGXFSZ: 'SIGXFSZ',
}
for num in signals:
signal(num, h)