有两个信号在python中是无法处理和更改的:SIGTOP和SIGKILL,之前想到用supervisord管理tomcat进程,我们向代理程序发送这个信号并拦截的思路不能实现。
会提示以下错误:
hartnettmatoMacBook-Pro:python hartnett$ python signal.py Traceback (most recent call last): File "signal.py", line 10, in <module> signal.signal(signal.SIGKILL, functionA) RuntimeError: (22, 'Invalid argument')
检查一下这个错误:
>>> import errno >>> errno.errorcode[22] 'EINVAL' //指定的信号sig无效
但是我们可以发送利用supervisord向代理程序发送SIGQUIT信号,测试代码如下:
hartnettmatoMacBook-Pro:python hartnett$ cat signal.py import signal import os import time def killself(signalnum, frame): print signalnum os.kill(os.getpid(), signal.SIGKILL) signal.signal(signal.SIGQUIT,killself) while True: time.sleep(100)
向这个进程发送信号3(SIGQUIT)后,确认该进程可捕获信号,并完成我们特定的指令,效果如下所示:
hartnettmatoMacBook-Pro:python hartnett$ python signal.py 3 Killed: 9