如果退出代码!= 0,如何仅使用 PM2 重新启动节点进程

问题描述 投票:0回答:4

我正在使用 pm2 来管理节点进程。 目前,pm2 会重新启动节点进程,即使它完全完成(退出代码为 0)。我不希望这种事发生。

相反,我只希望 PM2 在节点进程以代码 != 0 退出时重新启动应用程序。

如何做到这一点?

pm2 日志可能有用:

PM2        | App [xxx] with id [0] and pid [44797], exited with code [0] via signal [SIGINT]
PM2        | Starting execution sequence in -fork mode- for app name:xxx id:0
PM2        | App name:xxx id:0 online

编辑

似乎在集群模式下启动进程正如我所期望的那样。即:仅在退出代码 !=0 时重新启动。

仍然以 fork 模式启动会产生如上所述的意外行为。

node.js pm2
4个回答
6
投票

我查看了

pm2

的代码

https://github.com/Unitech/pm2/blob/6090b0971abca6fcb2d796e560f2a72b81ab5707/lib/God.js

并且在成功退出时不启动进程似乎没有任何逻辑。您要求的功能不存在。集群和分叉模式都是一样的。

您可以使用

test.js

进行测试
setTimeout(()=>process.exit(), 2000);

分叉模式

$ pm2 start test.js && sleep 5
[PM2] Starting /Users/tarunlalwani/Documents/Projects/SO/pm2exit/test.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬─────────┬──────┬──────┬────────┬─────────┬────────┬─────┬──────────┬──────────────┬──────────┐
│ App name │ id │ version │ mode │ pid  │ status │ restart │ uptime │ cpu │ mem      │ user         │ watching │
├──────────┼────┼─────────┼──────┼──────┼────────┼─────────┼────────┼─────┼──────────┼──────────────┼──────────┤
│ test     │ 0  │ N/A     │ fork │ 5889 │ online │ 0       │ 0s     │ 0%  │ 9.4 MB   │ tarunlalwani │ disabled │
└──────────┴────┴─────────┴──────┴──────┴────────┴─────────┴────────┴─────┴──────────┴──────────────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app
$ pm2 logs
PM2        | 2019-08-18T11:40:23: PM2 log: App [test:0] exited with code [0] via signal [SIGINT]
PM2        | 2019-08-18T11:40:23: PM2 log: App [test:0] starting in -fork mode-
PM2        | 2019-08-18T11:40:23: PM2 log: App [test:0] online
PM2        | 2019-08-18T11:40:25: PM2 log: App [test:0] exited with code [0] via signal [SIGINT]
PM2        | 2019-08-18T11:40:25: PM2 log: App [test:0] starting in -fork mode-
PM2        | 2019-08-18T11:40:25: PM2 log: App [test:0] online

$ pm2 delete test
$ pm2 start test.js -i 2&& sleep 5
[PM2] Starting /Users/tarunlalwani/Documents/Projects/SO/pm2exit/test.js in cluster_mode (2 instances)
[PM2] Done.
┌──────────┬────┬─────────┬─────────┬──────┬────────┬─────────┬────────┬─────┬───────────┬──────────────┬──────────┐
│ App name │ id │ version │ mode    │ pid  │ status │ restart │ uptime │ cpu │ mem       │ user         │ watching │
├──────────┼────┼─────────┼─────────┼──────┼────────┼─────────┼────────┼─────┼───────────┼──────────────┼──────────┤
│ test     │ 0  │ N/A     │ cluster │ 5993 │ online │ 0       │ 0s     │ 0%  │ 27.6 MB   │ tarunlalwani │ disabled │
│ test     │ 1  │ N/A     │ cluster │ 5994 │ online │ 0       │ 0s     │ 0%  │ 20.8 MB   │ tarunlalwani │ disabled │
└──────────┴────┴─────────┴─────────┴──────┴────────┴─────────┴────────┴─────┴───────────┴──────────────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

$ pm2 logs
PM2      | App name:test id:0 disconnected
PM2      | App [test:0] exited with code [0] via signal [SIGINT]
PM2      | App [test:0] starting in -cluster mode-
PM2      | App name:test id:1 disconnected
PM2      | App [test:1] exited with code [0] via signal [SIGINT]
PM2      | App [test:1] starting in -cluster mode-
PM2      | App [test:0] online
PM2      | App [test:1] online
PM2      | App name:test id:0 disconnected
PM2      | App [test:0] exited with code [0] via signal [SIGINT]
PM2      | App [test:0] starting in -cluster mode-
PM2      | App name:test id:1 disconnected
PM2      | App [test:1] exited with code [0] via signal [SIGINT]
PM2      | App [test:1] starting in -cluster mode-
PM2      | App [test:0] online
PM2      | App [test:1] online
PM2      | App name:test id:0 disconnected

$ pm2 delete test

替代方案

作为替代方案,您可以使用 Supervisord

可以使用配置文件中的

exitcodes

http://supervisord.org/configuration.html

autorestart
一起使用的该程序的“预期”退出代码列表。如果
autorestart
参数设置为意外,并且进程以除主管停止请求之外的任何其他方式退出,则
supervisor
d 将重新启动该进程(如果该进程以未在此定义的退出代码退出)列表。


3
投票

这个帖子迟到了,但我相信 pm2 现在支持这个。查看 https://pm2.keymetrics.io/docs/usage/restart-strategies/ 和“跳过特定退出代码的自动重启”部分

编辑:抱歉,这还不是解决方案。这里有一个与此 pm2 选项相关的未解决问题:https://github.com/Unitech/pm2/issues/5208。从表面上看,我不认为它会很快得到解决。因此,上述选项 应该 有效,但我认为目前在撰写本文时的 pm2 当前版本 (5.1.12) 中不起作用


0
投票

这可以使用

stop_exit_codes
参数实现。

请参阅此处:https://pm2.keymetrics.io/docs/usage/restart-strategies/

根据他们的文档:

命令行:

pm2 start app.js --stop-exit-codes 0

通过配置文件:

module.exports = [{
  script: 'app.js',
  stop_exit_codes: [0]
}]

-3
投票

--no-autorestart
选项添加到
pm2 start
或 JSON 配置文件中。

© www.soinside.com 2019 - 2024. All rights reserved.