Python – 捕获所有信号

在Linux下的Python 2.6中,我可以使用以下来处理一个TERM信号:

import signal def handleSigTERM(): shutdown() signal.signal(signal.SIGTERM, handleSigTERM) 

有什么办法可以为进程接收的所有信号设置一个处理程序,除了一次性设置它们?

Solutions Collecting From Web of "Python – 捕获所有信号"

你可以循环通过信号模块中的信号并设置它们。

 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)) 

如果你想摆脱这个尝试,只是忽略不能被捕获的信号。

 def receive_signal(signum, stack): if signum in [1,2,3,15]: print 'Caught signal %s, exiting.' %(str(signum)) sys.exit() else: print 'Caught signal %s, ignoring.' %(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) 

从Python 3.5开始,信号常量被定义为一个枚举 ,使得更好的方法:

 import signal catchable_sigs = set(signal.Signals) - {signal.SIGKILL, signal.SIGSTOP} for sig in catchable_sigs: signal.signal(sig, print) # Substitute handler of choice for `print` 

这是一个2/3兼容的方式,没有像其他人那么多的陷阱:

 from itertools import count import signal def set_all_signal_signals(handler): """Set all signals to a particular handler.""" for signalnum in count(1): try: signal.signal(signalnum, handler) print("set {}".format(signalnum)) except (OSError, RuntimeError): # Invalid argument such as signals that can't be blocked pass except ValueError: # Signal out of range break 

由于signalnum只是一个数字,所以迭代1超出范围将信号设置为特定的句柄。

该代码在当前版本的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)