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 には、コード 128 + シグナル番号で終了する前に端末モードをリセットする非 Windows プラットフォームのデフォルト ハンドラがあります。これらのシグナルのいずれかにリスナーがインストールされている場合、そのデフォルトの動作は削除されます (ノードは終了しなくなります)。

正常に終了したい場合は、デフォルトのシグナルハンドラをオーバーライドする必要があります:

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 に答える