gpt4 book ai didi

node.js - 为什么运行 Node.js 应用程序的 systemd 服务在正常停止时显示失败状态?

转载 作者:搜寻专家 更新时间:2023-10-31 23:30:50 25 4
gpt4 key购买 nike

我有一个运行 Node.js 应用程序的 systemd 服务文件。该服务似乎运行良好,但当我停止服务时,使用 systemctl stop train 服务进入失败状态。

[root@localhost portaj]# systemctl stop train
[root@localhost portaj]# systemctl status train
train.service - Train Service
Loaded: loaded (/etc/systemd/system/train.service; enabled)
Active: failed (Result: exit-code) since Mon 2014-08-04 04:40:17 UTC; 1s ago
Process: 25706 ExecStart=/opt/node/bin/node /opt/train/src/server/start.js (code=exited, status=143)
Main PID: 25706 (code=exited, status=143)

Aug 04 04:33:39 localhost.localdomain train[25706]: Train Server listening on port 3000
Aug 04 04:40:17 localhost.localdomain systemd[1]: Stopping Train Service...
Aug 04 04:40:17 localhost.localdomain systemd[1]: train.service: main process exited, code=exit.../a
Aug 04 04:40:17 localhost.localdomain systemd[1]: Stopped Train Service.
Aug 04 04:40:17 localhost.localdomain systemd[1]: Unit train.service entered failed state.

我的服务文件如下所示:

[Unit]
Description=Train Service
After=network.target

[Service]
Environment=PORT=4000
Environment=NODE_ENV=development
ExecStart=/opt/node/bin/node /opt/train/src/server/start.js
Restart=on-failure
SyslogIdentifier=train

[Install]
WantedBy=network.target

我怀疑 Node.js 应用正在返回 systemd 认为失败的状态代码。如果可能的话,我不确定是否需要让我的 Node.js 应用程序返回不同的状态代码。或者,如果我需要修改 systemd 服务文件以以某种方式采取不同的行为。

如果有帮助,部署脚本在这里:https://github.com/JonathanPorta/ansible-train

实际的 Node.js 应用程序在这里: https://github.com/JonathanPorta/train

在此先感谢您的帮助!

最佳答案

默认情况下,当使用 SIGINT 终止时,node.js 以状态码 143 退出。即 128+SIGTERM。这是预期的行为。来自文档:

SIGTERM and SIGINT have default handlers on non-Windows platforms that resets the terminal mode before exiting with code 128 + signal number. If one of these signals has a listener installed, its default behaviour will be removed (node will no longer exit).

如果你想优雅地退出,你将不得不override the default signal handler :

process.on('SIGTERM', function() {
console.log('SIGTERM')
// do whatever to terminate properly
// at worst, just 'exit(0)'
process.exit(0)
});

process.on('SIGINT', function() {
console.log('SIGINT')
// do whatever to terminate properly
// at worst, just 'exit(0)'
process.exit(0)
});

关于node.js - 为什么运行 Node.js 应用程序的 systemd 服务在正常停止时显示失败状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25111920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com