有没有办法使用cron重新启动pm2进程但是只有它还没有运行?

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

我想使用PM2通过重新启动我的Node.Js应用程序

pm2 restart app.js

使用crontab但仅在应用程序尚未运行时(例如,如果我的服务器崩溃并重新启动而pm2未重启)。

即使它正在运行,上面的命令仍会重新启动它。

我如何解决它?

UPDATE

我不希望我的应用程序重新启动,如果它已经运行。我希望它只在它被列为“已停止”或未运行时重新启动。一些建议提供了写一个bash脚本,但它会是什么?我尝试了下面的选项,但它们要么无法运行,要么重启应用程序,即使它正在运行。

node.js pm2
4个回答
6
投票

更好的方法是使用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,你应该怎么做。


3
投票

您要做的是启动任何已停止的应用程序而不会导致停机。一个好的解决方案是使用pm2 startOrReload命令。这将启动任何已停止的应用程序,并将重新加载任何当前的应用程序,而不会导致停机。

您将需要该命令的配置文件。如果您目前没有,可以使用pm2 ecosystem创建它。确保它指向app.js

然后在您的cron作业中运行此命令:

pm2 startOrReload <your ecosystem file>

有关更多选项,请参阅pm2 -hpm2 startOrReload -hpm2 ecosystem -h


3
投票

而不是在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

0
投票

改进@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。您还需要使用安装nodepm2的位置。可以通过在shell上运行which node找到。

可以将cron配置为每15分钟运行一次(或根据您的喜好)

*/15 * * * * ~/amb-cron.sh >> ~/logs/pm2-process.txt`
#you can create a log for your echos.
© www.soinside.com 2019 - 2024. All rights reserved.