有没有办法使用cron重新启动pm2进程但是只有它还没有运行?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法使用cron重新启动pm2进程但是只有它还没有运行?相关的知识,希望对你有一定的参考价值。
我想使用PM2通过重新启动我的Node.Js应用程序
pm2 restart app.js
使用crontab但仅在应用程序尚未运行时(例如,如果我的服务器崩溃并重新启动而pm2未重启)。
即使它正在运行,上面的命令仍会重新启动它。
我如何解决它?
UPDATE
我不希望我的应用程序重新启动,如果它已经运行。我希望它只在它被列为“已停止”或未运行时重新启动。一些建议提供了写一个bash脚本,但它会是什么?我尝试了下面的选项,但它们要么无法运行,要么重启应用程序,即使它正在运行。
更好的方法是使用pm2 startup
命令
http://pm2.keymetrics.io/docs/usage/startup/
要获取计算机的自动配置启动脚本,您需要键入以下命令:
# Detect available init system, generate configuration and enable startup system
pm2 startup
如果您愿意,可以指定您自己使用的平台(平台可以是上面引用的平台之一):
pm2 startup [ubuntu | ubuntu14 | ubuntu12 | centos | centos6 | arch | oracle | amazon | macos | darwin | freebsd | systemd | systemv | upstart | launchd | rcd | openrc]
此命令的输出可以是复制/粘贴行的建议,其中包含为您配置的所有环境变量和选项。
例:
[PM2]您必须以root身份运行此命令。执行以下命令:sudo su -c“env PATH = $ PATH:/home/unitech/.nvm/versions/node/v4.3/bin pm2 startup -u --hp
您只需复制/粘贴PM2为您提供的行,并为您的操作系统配置启动脚本。
一旦你运行sudo pm2 startup
。它将创建systemctl service
。您可以使用查看相同的状态
systemctl status pm2-root
默认情况下,服务未配置为自动重新启动。您将运行以下命令
sudo mkdir -p /etc/systemd/system/pm2-root.service.d
然后使用以下内容创建文件名10_auto_restart_pm2.conf
[Service]
Restart=always
RestartSec=3
之后执行
systemctl daemon-reload
systemctl restart pm2-service
现在让我们测试自动重启部分
$ systemctl status pm2-root.service
● pm2-root.service - PM2 process manager
Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/pm2-root.service.d
└─10_auto_restart_pm2.conf
Active: active (running) since Wed 2018-02-28 16:52:19 UTC; 11s ago
Docs: https://pm2.keymetrics.io/
Process: 5014 ExecStop=/usr/local/lib/node_modules/pm2/bin/pm2 kill (code=exited, status=0/SUCCESS)
Process: 5022 ExecStart=/usr/local/lib/node_modules/pm2/bin/pm2 resurrect (code=exited, status=0/SUCCESS)
Main PID: 5031 (PM2 v2.10.1: Go)
Tasks: 9
Memory: 24.3M
CPU: 460ms
CGroup: /system.slice/pm2-root.service
└─5031 PM2 v2.10.1: God Daemon (/home/vagrant/.pm2)
现在我们手动终止进程并等待3秒钟
$ kill -9 5031
$ sleep 3
$ systemctl status pm2-root.service
● pm2-root.service - PM2 process manager
Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/pm2-root.service.d
└─10_auto_restart_pm2.conf
Active: active (running) since Wed 2018-02-28 16:52:55 UTC; 641ms ago
Docs: https://pm2.keymetrics.io/
Process: 5057 ExecStop=/usr/local/lib/node_modules/pm2/bin/pm2 kill (code=exited, status=0/SUCCESS)
Process: 5081 ExecStart=/usr/local/lib/node_modules/pm2/bin/pm2 resurrect (code=exited, status=0/SUCCESS)
Main PID: 5088 (PM2 v2.10.1: Go)
Tasks: 9
Memory: 24.3M
CPU: 461ms
CGroup: /system.slice/pm2-root.service
└─5088 PM2 v2.10.1: God Daemon (/home/vagrant/.pm2)
如您所见,流程/服务已自动重启。不需要cron,你应该怎么做。
您要做的是启动任何已停止的应用程序而不会导致停机。一个好的解决方案是使用pm2 startOrReload
命令。这将启动任何已停止的应用程序,并将重新加载任何当前的应用程序,而不会导致停机。
您将需要该命令的配置文件。如果您目前没有,可以使用pm2 ecosystem
创建它。确保它指向app.js
。
然后在您的cron作业中运行此命令:
pm2 startOrReload <your ecosystem file>
有关更多选项,请参阅pm2 -h
,pm2 startOrReload -h
和pm2 ecosystem -h
。
而不是在cron中启动pm2进程,启动一个bash脚本,检查pm2是否已经在运行,如果不是这样,则重新启动它。
编辑
尝试以下(可能需要调整pgrep表达式,我不知道pm2进程的确切名称):
#!/bin/bash
pID=$(pgrep -x "pm2")
if [ -n "${pID}" ];
then
#do nothing
echo $pID "already running. not restarting."
else
# start it
echo "restarting"
# put your command to start your process here
fi
改进@Aydin K.回答
#! /bin/bash -l
ps cax | grep PM2 > /dev/null
if [ $? -eq 0 ]; then
echo $(date -u) - "PM2 is running."
else
echo $(date -u) - "Restarting PM2."
cd ~/app-location
~/bin/node ~/bin/pm2 start app.js
fi
Explanation
打破每个代码。
-l
中的#! /bin/bash -l
将使用.bashrc
的环境变量
ps cax | grep PM2 > /dev/null
获得PM2(Case-capital)的进程数,因为该进程被命名为“PM2 ......”
~/bin/node ~/bin/pm2 start app.js
这是一个很大的问题。在cron中使用node
命令之前,需要使用pm2
。您还需要使用安装node
和pm2
的位置。可以通过在shell上运行which node
找到。
可以将cron配置为每15分钟运行一次(或根据您的喜好)
*/15 * * * * ~/amb-cron.sh >> ~/logs/pm2-process.txt`
#you can create a log for your echos.
以上是关于有没有办法使用cron重新启动pm2进程但是只有它还没有运行?的主要内容,如果未能解决你的问题,请参考以下文章