当服务器处理被杀死时,如何重新启动PM2本身



我使用pm2运行我的node.js应用程序。但是,当我的应用程序超出内存限制时,有时我的Web托管提供商WebFaction(Hello!(有时我的Web托管提供商WebFaction(Hello!(会杀死我的共享服务器部分上的所有进程(实际上是基于Java的neo4j Graph Database,我可以这样做,而我'm致力于解决此问题(。

发生这种情况时,PM2由于某种原因认为它仍在运行,即使我的应用程序不在线(而数据库使用CRON重新启动数据库(。

当这样发生这种情况时,我如何确保pm2"知道"并重新启动我的node.js应用程序,即使它仍认为它仍在运行?

使用supervisormonit是推荐的,更好的方法。

然而,对我有用的快速和dirty黑客是将pm2-save和pm2繁荣实用程序与cron结合使用。

我运行了pm2 save,以节省我想要继续运行的所有节点进程的快照。然后,当我的PM2和节点应用程序以Linux-user登录为Linux-User(例如,在Amazon Linux上的ec2-user(时,我将其放在我的crontab(使用crontab -e(中:

* * * * * pm2 resurrect

这告诉Cron调度程序每天每分钟运行pm2 resurrect。这样可以确保即使Linux内核杀死PM2本身(这经常发生在我的小 t2.micro变为OOM时(,但最多会有60秒的停机时间:cron将确保PM2和我的Nodejs应用程序都会自动复活(如有必要(分钟。

pm2 resurrect在这里确实很有用,因为它可以安全地一遍又一遍地运行,并且不会重新启动任何运行过程或在重播上造成干扰。它只需检查所需的节点应用程序是否正在运行,如果是,则无能为力。但是,如果它们尚未运行,它使用pm2 save之前录制的配置来启动这些应用程序。

我通常使用monit之类的东西来保持过程运行。基本想法是拥有一个每分钟运行并在不运行的情况下启动PM2的Cronjob。

您将要配置PM2(或您使用的任何内容(来管理在前景中运行的过程(例如Substisord或Systemd(,或者监视PIDFILE,以便它可以确认该过程实际上正在运行并开始如果没有。我不知道如何在PM2中执行此操作的细节(从未使用过(,但是您可以在Substisord或Monit中执行此操作。

我认为这里有一个评论可能解释了为什么https://github.com/supervisor/supervisor/supervisor/sissues/147

为了实现停止命令,一个人需要跟踪Process PID。这通常是通过将PID文件存储在文件系统中的某个地方来完成的。这至少会产生两个问题1(可以删除PID文件(故意/无意/fs损坏(2(在系统崩溃或不gre乱的关闭时未删除PID文件(即拉插件事件(,而另一个过程则在同一PID时开始重新启动时id。

这些是极少数情况,但我经历了更多的次比我预期的。监视过程的唯一可靠方法状态是通过父母(主管(和使用内核来分配它控制/监控孩子的设施。

开始/停止/PID方法在99%的案例中起作用,适合通用应用程序是常见发生的,而不是大事。但是,有99%的申请够好了。想想工业自动化,机器人,汽车控制,飞行控制等

很少有以这种方式进行过程控制的工具(Daemontools,Runit,Systemd,Superiostor,Inittab,PM2(,有做正确的事和主管是最好的。

是最好的。

pm2将其pidfile存储在$HOME/.pm2/pm2.pid及其受监视过程(S(在$HOME/.pm2/pid/app-pm_id.pid处的PIDFILE,因此我想一种可能的方法是在系统重新启动时删除PID文件。我没有尝试过这个想法

最新更新