signals - 使用 supervisord 将信号传递到托管进程

标签 signals supervisord sigint sigkill

我正在使用 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 在调用关闭命令时发出“停止信号”,因此我将 INFO 语句视为我的应用程序没有响应 supervisord 发出的 SIGINT 的指示。

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

最佳答案

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

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

关于signals - 使用 supervisord 将信号传递到托管进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3533371/

相关文章:

bash 对信号没有反应

在多线程程序中捕获 SIGINT

c++ - Qt 5 : unable to declare signal that takes rvalue reference

c - 如何防止sendfile函数中的SIGPIPE

c++ - Gtkmm : How to update UI from another thread? 连续

bash - 如何在 Docker 上使用主管在后台启动 muli 进程

php - 如何检测 PHP CLI 脚本处于挂起状态

c - 如何通过 ctrl+C 或 ctrl+Z 杀死父进程及其子进程

supervisord - 如何使用supervisord在进程组中定义启动顺序?

linux - 在 bash 中捕获键盘中断