Python - 捕获所有信号
- 2024-11-08 09:04:00
- admin 原创
- 41
问题描述:
在 Linux 下的 python 2.6 中,我可以使用以下命令处理 TERM 信号:
import signal
def handleSigTERM():
shutdown()
signal.signal(signal.SIGTERM, handleSigTERM)
除了一次设置一个信号之外,还有其他方法可以为进程接收到的所有信号设置处理程序吗?
解决方案 1:
从 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:
您可以循环遍历信号模块中的信号并进行设置。
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))
解决方案 3:
如果你想摆脱尝试,只需忽略无法捕获的信号。
#!/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) \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()
解决方案 4:
适用于Windows 10和Python 3.7:
import signal
import time
def sighandler(signal,frame):
print("signal",sig,frame)
return
catchable_sigs = set(signal.Signals)
for sig in catchable_sigs:
try:
signal.signal(sig, sighandler)
print("Setting ",sig)
print ("value {}".format(sig))
except (ValueError, OSError, RuntimeError) as m:
print("Skipping ",sig)
print ("Value {}".format(sig))
# press some keys or issue kill
x = 0
while x < 5:
time.sleep(4)
x += 1
结果:
Skipping Signals.CTRL_C_EVENT
Value 0
Skipping Signals.CTRL_BREAK_EVENT
Value 1
Setting Signals.SIGINT
value 2
Setting Signals.SIGILL
value 4
Setting Signals.SIGFPE
value 8
Setting Signals.SIGSEGV
value 11
Setting Signals.SIGTERM
value 15
Setting Signals.SIGBREAK
value 21
Setting Signals.SIGABRT
value 22
解决方案 5:
这是一个 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 直到超出范围,将信号设置为特定的句柄。
解决方案 6:
在 Python3.8 中我们有了一个新功能signal.valid_signals()
https://docs.python.org/3/library/signal.html#signal.valid_signals
import signal
for sig in signal.valid_signals():
print(f"{sig:2d}",sig)
解决方案 7:
对于 Python 3:
for sig in signal.Signals:
try:
signal.signal(sig, sighandler)
except OSError:
print('Skipping', sig)
解决方案 8:
该代码在当前版本的 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)
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD