在Linux下的python 2.6中,我可以使用以下代码来处理术语信号:
import signal
def handleSigTERM():
shutdown()
signal.signal(signal.SIGTERM, handleSigTERM)
除了一次只设置一个信号之外,还有什么方法可以为进程接收到的所有信号设置一个处理程序吗?
发布于 2010-01-28 01:24:04
您只需循环通过信号模块中的信号并设置它们。
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))
发布于 2016-01-03 00:40:04
在Python3.5中,信号常量是defined as an enum,支持更好的方法:
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`
发布于 2011-04-15 04:06:35
如果你想摆脱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()
https://stackoverflow.com/questions/2148888
复制相似问题