<p>停止子进程时supervisord崩溃</p>

创建于 2014-12-09  ·  4评论  ·  资料来源: Supervisor/supervisor

当停止 supervisord 的子进程时,停止操作会超过 stopwaitsecs 的时间并使用“options.kill”来停止子进程。

2014-11-20 16:42:45,352 信息成功:使用 pid 46651 恢复进程“hbase--dptst-example--regionserver”
2014-12-09 02:56:47,389 警告使用 SIGKILL 杀死 'hbase--dptst-example--regionserver' (46651)
2014-12-09 02:56:47,422 CRIT 未知问题杀死 hbase--dptst-example--regionserver (46651): Traceback (最近一次通话最后):
文件“/home/work/app/supervisor/supervisor/process.py”,第 390 行,在 kill
options.kill(pid, sig)
文件“/home/work/app/supervisor/supervisor/options.py”,第 1219 行,在 kill
os.kill(pid,信号)
OSError: [Errno 3] 没有这样的进程

但是,这个异常使 supervisord 崩溃,我们可以忽略并跳过这个异常而不是使 supervisord 崩溃吗?

有什么想法可以分享吗? 谢谢

signals

最有用的评论

这个崩溃是由于 Subprocess.finish() 没有任何逻辑来处理 ProcessStates.UNKNOWN,它只在少数情况下出现(例如调用“supervisorctl stop”来终止一个摆动的进程,只是为了使 PID 变得无效在运行 options.kill 之前的片刻,它会在捕获到异常并将状态更改为 UNKNOWN 的情况下进行轰炸,因此最终会在此处使守护程序崩溃。 您可以通过在 options.kill(pid, sig) 之后放入“raise Exception()”来模拟竞态条件。

我们选择通过将状态更改为 FATAL 来为我们的应用程序服务器解决此问题(这样我们就不会被禁止修复进程),并在 finish() 中为最后的 else 分支添加一个 self.pid 健全性检查。

所有4条评论

:+1:

相关:#445

这个崩溃是由于 Subprocess.finish() 没有任何逻辑来处理 ProcessStates.UNKNOWN,它只在少数情况下出现(例如调用“supervisorctl stop”来终止一个摆动的进程,只是为了使 PID 变得无效在运行 options.kill 之前的片刻,它会在捕获到异常并将状态更改为 UNKNOWN 的情况下进行轰炸,因此最终会在此处使守护程序崩溃。 您可以通过在 options.kill(pid, sig) 之后放入“raise Exception()”来模拟竞态条件。

我们选择通过将状态更改为 FATAL 来为我们的应用程序服务器解决此问题(这样我们就不会被禁止修复进程),并在 finish() 中为最后的 else 分支添加一个 self.pid 健全性检查。

我们也看到了这个问题,我想深入了解根本原因,即主管认为进程已经在supervisorctl stop发送终止信号时终止,导致OSError: [Errno 3] No such process异常(如上所述,主管未能正确处理)。 但是每次我们看到这个问题时,我们试图杀死的进程实际上仍在运行,并且 PID 仍然存在于进程列表中( ps )。 可能是某种权限问题?

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

mnaberez picture mnaberez  ·  4评论

AlphaSRE picture AlphaSRE  ·  3评论

guettli picture guettli  ·  4评论

felipejfc picture felipejfc  ·  5评论

madmuffin1 picture madmuffin1  ·  4评论