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

时间:2018-02-19 18:43:05

标签: node.js pm2

我想使用PM2通过

重新启动我的Node.Js应用程序

pm2 restart app.js

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

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

我该如何解决?

更新

如果我的应用已经在运行,我不希望它重启。我希望它重新启动 如果它被列为"停止"或者如果它没有运行。 一些建议提供了写一个bash脚本,但它会是什么?我尝试了下面的选项,但即使它正在运行,它们也不会工作或重新启动应用程序。

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

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

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

pm2 startOrReload <your ecosystem file>

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

答案 3 :(得分:2)

对于 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 并检查。

更多信息

答案 4 :(得分: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

说明

破坏每个代码。

-l中的

#! /bin/bash -l将使用.bashrc中的环境变量

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

~/bin/node ~/bin/pm2 start app.js这是一个大问题。在cron中使用node命令之前,需要使用pm2。另外,您需要使用nodepm2的安装位置。可以通过在外壳上运行which node来找到。

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

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