我正在使用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和我的应用程序之间传递的信号?
答案 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