NodeJS: Демон на PM2

PM2 это менеджер процессов для node. В этой статье рассмотрим демонизацию процессов с использованием этого менеджера. Программисты сказали что forever не годится для продакшн хотя один проект нормально работал на нем. Пришлось осваивать новый менеджер.

Установка и настройка PM2

Установка производится трививиально через менеджер пакетов npm:

npm install pm2

Настройки как таковой не требуется кроме того что надо запускать из под конкретного пользователя впрочем как и forever. Пробуем запустить приложение:

su pm2
pm2 start /opt/client1/server.js

Запускаем второй процесс:

pm2 start /opt/client2/server.js

Смотрим какие процессы запущены на данный момент:

pm2 monit
NodeJS: Демон на PM2 1

Далее чтобы эти процессы запускались автоматически после скажем перезагрузки сервера надо выполнить:

pm2 save

Выполнив данную команду иногда можно получить ошибку в духе:

[PM2] Saving current process list...
>>>> In-memory PM2 is out-of-date, do:
>>>> $ pm2 update
In memory PM2 version: 3.5.2
Local PM2 version: 3.5.1

В этом случае надо переключиться на пользователя root и обновить pm2:

ctrl+d
npm install pm2@latest -g
su pm2
pm2 update

Теперь надо создать скрипт для systemd:

pm2 startup

При этом выплюнет что надо выполнить команду в духе:

[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u pm2 --hp /home/pm2

Выполняем указанную команду от рута и пробуем запустить:

ctrl+d
env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup
systemctl start pm2-pm2

Если выходит ошибка вроде:

May 27 21:08:16 ip-172-31-43-61 systemd[1]: pm2-pm2.service: Service hold-off time over, scheduling restart.
May 27 21:08:16 ip-172-31-43-61 systemd[1]: pm2-pm2.service: Scheduled restart job, restart counter is at 5.
May 27 21:08:16 ip-172-31-43-61 systemd[1]: Stopped PM2 process manager.
May 27 21:08:16 ip-172-31-43-61 systemd[1]: pm2-pm2.service: Start request repeated too quickly.
May 27 21:08:16 ip-172-31-43-61 systemd[1]: pm2-pm2.service: Failed with result 'protocol'.
May 27 21:08:16 ip-172-31-43-61 systemd[1]: Failed to start PM2 process manager.

То сперва надо убить все запущенные процессы pm2 и стартовать заново:

ps -ef|grep pm2
....
убиваем все процессы по PID
....
systemctl start pm2-pm2