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

Is there a way to restart pm2 process using cron but only if it's not already running?

我想通过

使用 PM2 重启我的 Node.Js 应用程序

pm2 restart app.js

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

上面的命令无论如何都会重新启动它,即使它是 运行。

我该如何解决?

更新

如果我的应用程序已经 运行,我不想重新启动它。如果它被列为 "stopped" 或者不是 运行,我希望它 重新启动。 一些建议提供编写 bash 脚本,但它会是什么?我尝试了以下选项,但它们要么不起作用,要么重新启动应用程序,即使它是 运行.

不是在 cron 中启动 pm2 进程,而是启动一个 bashscript 来检查 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

更好的方法是使用 pm2 startup 命令

http://pm2.keymetrics.io/docs/usage/startup/

要为您的计算机获取 automatically-configured 启动脚本,您需要键入以下命令:

# 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]

此命令的输出可以是 copy/paste 行的推荐,其中包含为您配置的所有环境变量和选项。

示例:

[PM2] You have to run this command as root. Execute the following command: sudo su -c "env PATH=$PATH:/home/unitech/.nvm/versions/node/v4.3/bin pm2 startup -u --hp

您只需 copy/paste PM2 给您的行,启动脚本就会为您的 OS.

配置

曾经 运行 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)

如您所见,process/service 已自动重新启动。不需要 cron,这就是你应该做的。

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

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

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

pm2 startOrReload <your ecosystem file>

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

改进@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

说明

破解每一个密码。

-l in #! /bin/bash -l 将使用来自 .bashrc

的环境变量

ps cax | grep PM2 > /dev/null 获取PM2(大写)的进程数,因为进程被命名为"PM2 ..."

~/bin/node ~/bin/pm2 start app.js这是一个大收获。在 cron 中使用 pm2 命令之前,您需要先使用 node。您还需要使用安装 nodepm2 的位置。可以通过 运行ning which node 在您的 shell.

上找到

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

*/15 * * * * ~/amb-cron.sh >> ~/logs/pm2-process.txt`
#you can create a log for your echos.

对于Linux

我的用例:运行 应用程序每 3 秒一次。

简单方法:

pm2 startup 这将创建一个命令,复制并 运行 它。

pm2 start app.js --restart-delay=3000 每 3000 毫秒重新启动应用程序

pm2 save

最后,重启 Linux 并测试。

对于Windows

用例:运行 每 3 分钟 app.py。

  1. https://github.com/jessety/pm2-installer

  2. pm2 start app.py --cron "*/3 * * * *" --no-autorestart --time

  3. pm2 save

重新启动Windows并检查。

更多信息