我使用PM2来运行我的node.js应用程序。它工作正常,但是,当我的应用程序超出内存限制时,有时我的Web托管提供商WebFaction(你好!)会杀死我共享服务器上的所有进程(它实际上是基于java的{{1}图表数据库这样做,我正在努力解决这个问题。)
当发生这种情况时,PM2由于某种原因认为它仍在运行,即使我的应用程序不在线(使用cron重新启动数据库)。
如何确保PM2"知道"当这样的事情发生并重新启动我的node.js应用程序,即使它认为它还在运行?
答案 0 :(得分:1)
我通常使用monit之类的东西来保持进程运行。基本的想法是拥有一个每分钟运行一次的cronjob,如果它没有运行则启动PM2。
您需要配置PM2(或您用于此的任何内容)来管理在前台运行的进程(如SupervisorD或SystemD),或监视PID文件以便它可以确认进程实际正在运行并启动如果没有。我不知道如何在PM2中执行此操作的细节(从未使用过它),但您可以在SupervisorD或Monit中执行此操作。
答案 1 :(得分:0)
使用class meta:
或supervisor
是推荐的更好的方法。
但是,一种对我有用的快捷技巧是将pm2-save and pm2-resurrect实用程序与cron结合使用。
我运行了monit
以保存我想继续运行的所有节点进程的快照。然后,以我的pm2和Node应用程序运行身份的Linux用户身份登录(例如,在我的Amazon Linux上为pm2 save
),我将其放在crontab中(使用ec2-user
):>
crontab -e
这是在告诉cron调度程序每天* * * * * pm2 resurrect
每天运行。这样可以确保即使Linux内核杀死了pm2本身(这通常在我小的pm2 resurrect
变为OOM时发生)也将最多有60秒钟的停机时间:cron将确保pm2和我的NodeJS应用程序复活(如果每分钟自动)。
t2.micro
在这里真的很有用,因为它是幂等的,因为您可以一次又一次安全地运行它,并且它不会重新启动任何正在运行的进程或导致重新运行中断。它仅检查所需的节点应用程序是否正在运行,如果正在运行,则不执行任何操作。但是,如果尚未运行,则使用pm2 resurrect
记录的配置启动这些应用。
答案 2 :(得分:0)
我认为这里的一条评论可能解释了为什么 https://github.com/Supervisor/supervisor/issues/147
<块引用>为了执行停止命令,需要跟踪进程 pid。这通常通过将 pid 文件存储在文件系统中的某处来完成。这至少会产生两个问题 1) pid 文件可以被删除(有意/无意/fs 损坏) 2)pid 文件在系统崩溃或非正常关机(即拔掉插头事件)时不会被删除,并且另一个进程以相同的 pid 启动重新启动时的 ID。
这些是罕见的情况,但我经历了更多次 比我预期的要好。监控过程的唯一可靠方法 状态是通过从父级(主管)分叉它并使用内核 控制/监视孩子的设施。
start/stop/pid 方法适用于 99% 的情况,适用于 常见故障的通用应用程序,而不是一个 大不了。但是,有些应用程序 99% 不是 够好了。想想工业自动化、机器人、汽车控制, 飞行控制等
很少有工具以这种方式进行过程控制 (daemontools、runit、systemd、supervisor、inittab、pm2),有 做得对的更少,主管是最好的之一。
PM2 将其 pidfile 存储在 $HOME/.pm2/pm2.pid
并将其监控进程的 pidfile 存储在 $HOME/.pm2/pid/app-pm_id.pid
,因此我想一种可能的方法是在系统重新启动时删除 pid 文件。我没有试过这种想法