Mar*_*lka 3 process node.js supervisord yarnpkg
我在使用 Supervisord 部署新服务时遇到了一些奇怪的事情。这些是相关部分:
\n# supervisord.conf\n\n[program:express]\ncommand=yarn re-express-start\nRun Code Online (Sandbox Code Playgroud)\n# package.json\n{\n "scripts": {\n "re-express-start": "node lib/js/client/Express.bs.js",\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n当我运行时supervisorctl start,节点服务器按预期启动。但是在我运行之后supervisorctl stop,服务器继续运行,即使主管认为它已被杀死。
如果我将supervisord.conf文件更改为直接执行node lib/js/client/Express.bs.js(无需经过yarn),那么这将按预期工作。但我想浏览一下package.json定义的脚本。
我研究了进程树的样子,但不太明白为什么。以下是停止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\nRun Code Online (Sandbox Code Playgroud)\n从上面可以看出,执行服务器操作的“实际”工作负载进程具有 PID 12797。它由主管进程生成,并嵌套在其他几个进程下。\n停止主管进程会停止具有 PID12785和 的进程12796,但不会停止实际12797重新附加到 init 进程的进程。
对这里发生的事情有什么想法吗?这是由于忽略了某些 SIGxxx 信号造成的吗?我认为这是yarn调用以某种方式吃掉那些,\n但我不知道如何以及如何重新配置。
当我运行 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)错误。
| 归档时间: |
|
| 查看次数: |
2070 次 |
| 最近记录: |