重新启动后,Python进程停止响应SIGTERM / SIGINT
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了重新启动后,Python进程停止响应SIGTERM / SIGINT,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1894字,纯文字阅读大概需要3分钟。
内容图文
![重新启动后,Python进程停止响应SIGTERM / SIGINT](/upload/InfoBanner/zyjiaocheng/949/f1421944436a4cc399a8b8f5e180f721.jpg)
我在使用看门狗进程运行某些python进程时遇到了一个奇怪的问题.
看门狗进程是用python编写的,并且是父进程,它具有一个名为start_child(name)的函数,该函数使用subprocess.Popen打开子进程.记录了Popen对象,以便看门狗可以使用poll()监视进程,并最终在需要时以Terminate()结尾.
如果孩子意外死亡,看门狗会再次调用start_child(name)并记录新的Popen对象.
有7个子进程,所有子进程也是python.如果我手动运行任何子级,则可以使用kill发送SIGTERM或SIGINT并获得期望的结果(过程结束).
但是,从看门狗进程运行时,孩子只会在FIRST信号之后结束.当看门狗重新启动子进程时,新的子进程不再响应SIGTERM或SIGINT.我不知道是什么原因造成的.
看门狗
class watchdog:
# <snip> various init stuff
def start(self):
self.running = true
kids = ['app1', 'app2', 'app3', 'app4', 'app5', 'app6', 'app7']
self.processes = {}
for kid in kids:
self.start_child(kid)
self.thread = threading.Thread(target=self._monitor)
self.thread.start()
while self.running:
time.sleep(10)
def start_child(self, name):
try:
proc = subprocess.Popen(name)
self.processes[name] = proc
except:
print "oh no"
else:
print "started child ok"
def _monitor(self):
while self.running:
time.sleep(1)
if self.running:
for kid, proc in self.processes.iteritems():
if proc.poll() is not None: # process ended
self.start_child(kid)
因此,发生的情况是watchdog.start()启动所有7个进程,并且如果我发送任何进程SIGTERM,它将结束,然后监视线程将再次启动它.但是,如果我随后发送新进程SIGTERM,它将忽略它.
我应该能够一遍又一遍地向重新启动的进程发送kill -15.他们为什么在重启后会忽略它?
解决方法:
如此处所述:http://blogs.gentoo.org/agaffney/2005/03/18/python_sucks,当Python创建一个新线程时,它将阻止该线程(以及该线程产生的任何进程)的所有信号.
我使用通过ctypes调用的sigprocmask修复了此问题.这可能是也可能不是“正确”的方法,但是它确实起作用.
在子进程中,在__init__期间:
libc = ctypes.cdll.LoadLibrary("libc.so")
mask = '\x00' * 17 # 16 byte empty mask + null terminator
libc.sigprocmask(3, mask, None) # '3' on FreeBSD is the value for SIG_SETMASK
内容总结
以上是互联网集市为您收集整理的重新启动后,Python进程停止响应SIGTERM / SIGINT全部内容,希望文章能够帮你解决重新启动后,Python进程停止响应SIGTERM / SIGINT所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。