3

我有一个运行 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

在此先感谢您的帮助!

4

2 回答 2

7

默认情况下,当使用 杀死时SIGINTnode.js会以状态码 143 退出。即128+SIGTERM. 这是预期的行为。从文档:

SIGTERM 和 SIGINT 在非 Windows 平台上具有默认处理程序,可在退出前重置终端模式,代码为 128 + 信号编号。如果这些信号之一安装了侦听器,则其默认行为将被删除(节点将不再退出)。

如果你想优雅地退出,你将不得不覆盖默认的信号处理程序

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)
});
于 2014-08-05T10:36:35.263 回答
2

您可以在服务单元文件中指定您的自定义合法退出状态:SuccessExitStatus=143

于 2015-03-27T17:37:05.137 回答