使用supervisord将信号传递给托管进程

时间:2010-08-20 17:34:43

标签: signals supervisord sigint sigkill

我正在使用supervisord来生成和管理我在C语言中为linux目标编写的FastCGI应用程序。我有一个信号处理程序,在收到SIGINT时正常退出我的应用程序。我已通过在终端窗口中运行应用程序并发出Ctrl-C退出来验证信号处理程序是否正常工作。

当向supervisord发出“shutdown”命令时(通过supervisorctl),看来supervisord无法在不调用SIGKILL的情况下强制退出应用程序:

2010-08-20 10:02:49,661 INFO waiting for cse to die
2010-08-20 10:02:52,665 INFO waiting for cse to die
2010-08-20 10:02:55,669 INFO waiting for cse to die
2010-08-20 10:02:58,672 INFO waiting for cse to die
2010-08-20 10:02:59,673 WARN killing 'cse' (2031) with SIGKILL
2010-08-20 10:02:59,674 INFO stopped: cse (terminated by SIGKILL)

我的supervisord.conf文件中有以下内容

stopsignal=INT

我的假设是supervisord在调用shutdown命令时发出“stopsignal”,所以我把INFO语句作为我的应用程序没有响应supervisord发出的SIGINT的指示。

如何调试在supervisord和我的应用程序之间传递的信号?

3 个答案:

答案 0 :(得分:3)

经过多次挖掘后,似乎问题不在于supervisord未能将信号传递给子进程。这似乎正常。

相反,一旦收到调用stopignal的请求,supervisord就会停止记录子进程stderr输出。因此,supervisord不会处理子进程关闭的任何基于stderr的日志记录。在我的例子中,这使得子进程看起来没有接收到SIGINT,因为在调用信号之后它没有向stderr记录任何内容。

答案 1 :(得分:2)

您可以在调试模式下在命令行上运行supervisord并获取更多信息。

supervisord -n -e debug

答案 2 :(得分:2)

根据此提交,这是一个已在Supervisor 3.0a10(2011-03-30)版本中修复的错误:https://github.com/Supervisor/supervisor/commit/e19cbc185dfad045c8775750d36ab8ceed4c4dfb