Supervisord 不会在停止命令时杀死所有生成的节点进程

Mar*_*lka 3 process node.js supervisord yarnpkg

我在使用 Supervisord 部署新服务时遇到了一些奇怪的事情。这些是相关部分:

\n
# supervisord.conf\n\n[program:express]\ncommand=yarn re-express-start\n
Run Code Online (Sandbox Code Playgroud)\n
# package.json\n{\n  "scripts": {\n    "re-express-start": "node lib/js/client/Express.bs.js",\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

当我运行时supervisorctl start,节点服务器按预期启动。但是在我运行之后supervisorctl stop,服务器继续运行,即使主管认为它已被杀死。

\n

如果我将supervisord.conf文件更改为直接执行node lib/js/client/Express.bs.js(无需经过yarn),那么这将按预期工作。但我想浏览一下package.json定义的脚本。

\n

我研究了进程树的样子,但不太明白为什么。以下是停止supervisord-management服务之前和之后的流程。

\n
$ ps aux | grep node\nuser     12785  1.4  3.5 846404 72912 ?        Sl   16:30   0:00 node /usr/bin/yarn re-express-start\nuser     12796  0.0  0.0   4516   708 ?        S    16:30   0:00 /bin/sh -c node lib/js/client/Express.bs.js\nuser     12797  5.2  2.7 697648 56384 ?        Sl   16:30   0:00 /usr/bin/node lib/js/client/Express.bs.js\nroot     12830  0.0  0.0  14216  1004 pts/1    S+   16:30   0:00 grep --color=auto node\n\n$ pstree -c -l -p -s 12785\nsystemd(1)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80supervisord(7153)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80node(12785)\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80sh(12796)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80node(12797)\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80{node}(12798)\n                                             \xe2\x94\x82                         \xe2\x94\x94\xe2\x94\x80{node}(12807)\n                                             \xe2\x94\x9c\xe2\x94\x80{node}(12786)\n                                             \xe2\x94\x94\xe2\x94\x80{node}(12795)\n\n$ supervisorctl stop express\n\n$ ps aux | grep node\nuser     12797  0.7  2.7 697648 56384 ?        Sl   16:30   0:00 /usr/bin/node lib/js/client/Express.bs.js\nroot     12975  0.0  0.0  14216   980 pts/1    S+   16:32   0:00 grep --color=auto node\n\n$ pstree -c -l -p -s 12797\nsystemd(1)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80node(12797)\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80{node}(12798)\n                         \xe2\x94\x94\xe2\x94\x80{node}(12807)\n\n$ kill 12797\n\n$ ps aux | grep node\nroot     13426  0.0  0.0  14216   976 pts/1    S+   16:37   0:00 grep --color=auto node\n
Run Code Online (Sandbox Code Playgroud)\n

从上面可以看出,执行服务器操作的“实际”工作负载进程具有 PID 12797。它由主管进程生成,并嵌套在其他几个进程下。\n停止主管进程会停止具有 PID12785和 的进程12796,但不会停止实际12797重新附加到 init 进程的进程。

\n

对这里发生的事情有什么想法吗?是由于忽略了某些 SIGxxx 信号造成的吗?我认为这是yarn调用以某种方式吃掉那些,\n但我不知道如何以及如何重新配置​​。

\n

Fla*_*ame 7

当我运行 Node Express 应用程序时,我也遇到了这个问题。问题似乎是我正在拨打npm start涉及package.json start脚本的主管电话。该脚本只是调用node app.js. 解决方案似乎是直接从主管配置文件调用该命令,如下所示:

[program:node]
...
command=node app.js
...
stopasgroup=true
stopsignal=QUIT
Run Code Online (Sandbox Code Playgroud)

另外,我添加stopasgroup并更改stopsignal为QUIT。为了正确终止该进程,似乎需要停止信号。

我现在可以自由调用supervisorctl restart node:node_00,不会出现任何ERROR (spawn error)错误。

  • 看起来 `stopasgroup=true` 成功了。将停止信号保留为默认值(术语)对我来说效果很好。谢谢! (3认同)