Есть ли способ перезапустить процесс pm2 с помощью cron, но только если он еще не запущен?

Я хочу перезапустить свой узел.Js приложение с использованием PM2 через

pm2 restart app.js

использование crontab, но только если приложение еще не запущено (например, если мой сервер разбился и перезапустился, а pm2 не перезапустился).

команда выше перезапускает его в любом случае, даже если он работает.

Как это исправить?

обновление

Я не хочу, чтобы мое приложение перезапускалось, если оно уже запущено. Я хочу, чтобы он перезапустился только если он указан как" остановлен " или если он не работает. Некоторые предложения предлагают написать сценарий bash, но что это будет? Я попробовал следующие параметры, но они либо не работают, либо перезапускают приложение, даже если оно работает.

3 ответов


вместо запуска процесса pm2 в cron запустите 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/

чтобы получить автоматически настроенный скрипт запуска для вашей машины, вам нужно ввести следующую команду:

# 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. Выполните следующую команду: судо Су-c "путь ОКР=$путь:/главная/компания "юнитек"/.nvm / версии / узел / 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 секунды!--13-->

$ 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 не нужен, и это то, как вы должны это делать.


то, что вы хотите сделать, это запустить любые остановленные приложения без простоя. Хорошим решением является использование