在使用supervisord部署新服务时,我遇到了一些奇怪的事情。以下是有关的部分:
# supervisord.conf
[program:express]
command=yarn re-express-start# package.json
{
"scripts": {
"re-express-start": "node lib/js/client/Express.bs.js",
}
}当我运行supervisorctl start时,节点服务器将按预期的方式启动。但是在我运行supervisorctl stop之后,服务器继续运行,尽管主管认为它已经被杀死了。
如果我将supervisord.conf文件更改为直接执行node lib/js/client/Express.bs.js (而不通过yarn),那么它将如预期的那样工作。但是我想看一下package.json-defined脚本。
我研究了过程树的外观,但我不太明白为什么。下面是停止监督管理服务之前和之后的过程。
$ ps aux | grep node
user 12785 1.4 3.5 846404 72912 ? Sl 16:30 0:00 node /usr/bin/yarn re-express-start
user 12796 0.0 0.0 4516 708 ? S 16:30 0:00 /bin/sh -c node lib/js/client/Express.bs.js
user 12797 5.2 2.7 697648 56384 ? Sl 16:30 0:00 /usr/bin/node lib/js/client/Express.bs.js
root 12830 0.0 0.0 14216 1004 pts/1 S+ 16:30 0:00 grep --color=auto node
$ pstree -c -l -p -s 12785
systemd(1)───supervisord(7153)───node(12785)─┬─sh(12796)───node(12797)─┬─{node}(12798)
│ └─{node}(12807)
├─{node}(12786)
└─{node}(12795)
$ supervisorctl stop express
$ ps aux | grep node
user 12797 0.7 2.7 697648 56384 ? Sl 16:30 0:00 /usr/bin/node lib/js/client/Express.bs.js
root 12975 0.0 0.0 14216 980 pts/1 S+ 16:32 0:00 grep --color=auto node
$ pstree -c -l -p -s 12797
systemd(1)───node(12797)─┬─{node}(12798)
└─{node}(12807)
$ kill 12797
$ ps aux | grep node
root 13426 0.0 0.0 14216 976 pts/1 S+ 16:37 0:00 grep --color=auto node从上面看,执行服务器内容的“实际”工作负载过程具有PID 12797。它是由监督者进程产生的,并嵌套在更多的几个下面。停止监控程序使用PID 12785和12796停止进程,但不停止实际重新连接到init进程的12797。
对这里发生了什么有什么想法吗?这是因为忽略了一些SIGxxx信号吗?我猜想是yarn调用在某种程度上吞噬了它们,但我不知道如何以及如何重新配置。
发布于 2021-08-09 22:47:22
在运行应用程序时,我也遇到了这个问题。问题似乎是我让主管打电话给npm start,这是指package.json start脚本。该脚本只需调用node app.js。解决方案似乎是直接从主管配置文件中调用该命令,如下所示:
[program:node]
...
command=node app.js
...
stopasgroup=true
stopsignal=QUIT此外,我还添加了stopasgroup,并将stopsignal更改为退出。停止信号似乎是必要的,以正确地杀死这一过程。
现在,我可以自由地调用supervisorctl restart node:node_00,而不会出现任何ERROR (spawn error)错误。
https://stackoverflow.com/questions/67487983
复制相似问题