PM2 управлял процессом в состоянии ошибки после перезагрузки машины - PullRequest
20 голосов
/ 14 мая 2019

Я использую pm2 (версия 3.4.1) для управления сервером веб-сокетов Laravel Echo .Он работает отлично, но я пытаюсь запустить его автоматически после перезагрузки компьютера (на котором работает Ubuntu 16.04).Для этого я следовал этим инструкциям :

$ 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/share/.config/yarn/global/node_modules/pm2/bin/pm2 startup systemd -u kramer65 --hp /home/kramer65

$ sudo env PATH=$PATH:/usr/bin /usr/local/share/.config/yarn/global/node_modules/pm2/bin/pm2 startup systemd -u kramer65 --hp /home/kramer65
[sudo] password for kramer65: 
[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=kramer65
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/kramer65/.pm2
PIDFile=/home/kramer65/.pm2/pm2.pid

ExecStart=/usr/local/share/.config/yarn/global/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/local/share/.config/yarn/global/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/local/share/.config/yarn/global/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-kramer65.service
Command list
[ 'systemctl enable pm2-kramer65' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-kramer65.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-kramer65...
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via: $ pm2 save

[PM2] Remove init script via: $ pm2 unstartup systemd

Итак, я запустил pm2 save:

$ pm2 save
[PM2] Saving current process list...
[PM2] Successfully saved in /home/kramer65/.pm2/dump.pm2

После этого я перезагружаю машину, возвращаю ssh обратнои проверьте процессы pm2:

$ pm2 status
┌──────────┬────┬─────────┬──────┬─────┬─────────┬─────────┬────────┬─────┬────────┬────────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status  │ restart │ uptime │ cpu │ mem    │ user   │ watching │
├──────────┼────┼─────────┼──────┼─────┼─────────┼─────────┼────────┼─────┼────────┼────────┼──────────┤
│ echo     │ 0  │ N/A     │ fork │ N/A │ errored │ 0       │ 0      │ 0%  │ 0 B    │ kramer65 │ disabled │
└──────────┴────┴─────────┴──────┴─────┴─────────┴─────────┴────────┴─────┴────────┴────────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

Как видите, состояние имеет ошибку.Если я остановлю и начну процесс (pm2 stop echo && pm2 start echo), процесс запустится снова.

Журнал ошибок (~ / .pm2 / pm2.log) сообщает мне следующее:

2019-05-14T11:56:36: PM2 log: ===============================================================================
2019-05-14T11:56:36: PM2 log: --- New PM2 Daemon started ----------------------------------------------------
2019-05-14T11:56:36: PM2 log: Time                 : Tue May 14 2019 11:56:36 GMT+0200 (CEST)
2019-05-14T11:56:36: PM2 log: PM2 version          : 3.4.1
2019-05-14T11:56:36: PM2 log: Node.js version      : 8.15.1
2019-05-14T11:56:36: PM2 log: Current arch         : x64
2019-05-14T11:56:36: PM2 log: PM2 home             : /home/kramer65/.pm2
2019-05-14T11:56:36: PM2 log: PM2 PID file         : /home/kramer65/.pm2/pm2.pid
2019-05-14T11:56:36: PM2 log: RPC socket file      : /home/kramer65/.pm2/rpc.sock
2019-05-14T11:56:36: PM2 log: BUS socket file      : /home/kramer65/.pm2/pub.sock
2019-05-14T11:56:36: PM2 log: Application log path : /home/kramer65/.pm2/logs
2019-05-14T11:56:36: PM2 log: Process dump file    : /home/kramer65/.pm2/dump.pm2
2019-05-14T11:56:36: PM2 log: Concurrent actions   : 2
2019-05-14T11:56:36: PM2 log: SIGTERM timeout      : 1600
2019-05-14T11:56:36: PM2 log: ===============================================================================
2019-05-14T11:56:36: PM2 log: App [echo:0] starting in -fork mode-
2019-05-14T11:56:36: PM2 log: App [echo:0] online
2019-05-14T11:56:36: PM2 error: Error: spawn node ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:190:19)
    at onErrorNT (internal/child_process.js:362:16)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)

ДелаетКто-нибудь есть идеи, что здесь происходит?

1 Ответ

7 голосов
/ 17 мая 2019

ENOENT обозначает Нет такой записи каталога

Что делает env <command>?( от Chris Johnsen )

Команда env используется для запуска другой программы в пользовательской среде без изменения текущей.

sudo env PATH=$PATH:/usr/bin \
   /usr/local/share/.config/yarn/global/node_modules/pm2/bin/pm2 \
   startup systemd -u kramer65 --hp /home/kramer65

Установка примечание из pm2 документации Чтобы обнаружить доступные системы инициализации на вашем компьютере и сгенерировать конфигурацию, используйте:

pm2 startup
$ [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 <distribution> -u <user> --hp <home-path>

Я разбью команду следующим образом

sudo env name=value name2=value2 program and args

1) Программа

запускает команду program /usr/local/share/.config/yarn/global/node_modules/pm2/bin/pm2

Первый оставшийся аргумент указывает имя программы для вызова;поиск производится в соответствии с переменной окружения PATH.

2) аргументы передано

Все остальные аргументы передаются в качестве аргументов этой программе.

args передано pm2 команда cli: startup systemd -u kramer65 --hp /home/kramer65.

3) Среда , используемая для выполнения программы

со средой, сформированной путем расширения текущей среды переменными среды и значениями, обозначенными как name = valueи имя2 = значение2.

В соответствии с документами pm2 должна быть папка внутри /home/kramer/.nvm/versions/node/v4.3/bin

PATH=$PATH:/home/unitech/.nvm/versions/node/v4.3/bin

, когда вы используете папку за пределами каталога home, потому что вы работаетестарая версия nodejs (см. последнюю главу Nodejs установлен в usr / bin / node ).

PATH=$PATH:/usr/bin

4) Пользователь права доступа

вы передаете --user kramer65 --home-path /home/kramer65 команде pm2 cli.

-u <user> --hp <home-path>

Сохраните ваш процесс

Хук запуска автоматически загружает список процессов, который вы ранее сохранили,Сохраните список процессов с помощью:

pm2 save

Nodejs, установленного в usr/bin/node ( Ошибка: порождает ENOENT в Ubuntu 14.04 )

Как воспроизвести: у вас есть две версии nodejs на вашем компьютере.Одна - старая версия, установленная в /usr/bin/node, а другая - недавняя версия, расположенная в ./nodejs/node.Я запускаю свой менеджер pm2 программно, вызывая ./nodejs/node myManager.js, который вызовет pm2.connect (), который попытается порождать демона PM2.

В результате происходит запуск демона PM2 с использованием старогодвоичный файл узла /usr/bin/node вместо недавнего двоичного файла узла, выполняющего мой сценарий myManager.js (расположен в ./nodejs/node).

Для этого нужно найти двоичный файл узла в текущем каталоге, а затем по умолчанию использовать узелдвоичные файлы в пути. НО двоичный файл узла, на котором выполняется текущий код, находится в ./nodejs/node.Чтобы запустить демон PM2 с тем же двоичным файлом узла, что и текущий процесс, вам нужно использовать process.execPath

. Вы можете прочитать дополнительную информацию в и в соответствующемобсуждение

...