5

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

当向 supervisord(通过 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 命令时发出“停止信号”,所以我将 INFO 语句作为我的应用程序没有响应 supervisord 发出的 SIGINT 的指示。

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

4

3 回答 3

5

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

相反,supervisord 似乎在收到调用 stopsignal 的请求后停止记录子进程 ​​stderr 输出。因此,supervisord 不会处理任何基于 stderr 的子进程关闭日志记录。就我而言,这使得子进程似乎没有收到 SIGINT,因为在调用信号后它没有将任何内容记录到 stderr。

于 2010-08-31T15:14:34.363 回答
3

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

supervisord -n -e 调试

于 2010-08-23T19:40:30.640 回答
3

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

于 2012-09-06T20:14:27.377 回答