pm2 управляемый процесс в состоянии ошибки после перезагрузки машины

Я использую 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)

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


person kramer65    schedule 14.05.2019    source источник
comment
Что journalctl -u service-name.service говорит?   -  person suv    schedule 16.05.2019
comment
Какая у вас версия pm2?   -  person Mehdi Benmoha    schedule 16.05.2019
comment
@suv - Вы имеете в виду буквально journalctl -u service-name.service? Это говорит No journal files were opened due to insufficient permissions., и если я вызываю это с sudo, я получаю -- No entries --. Я полагаю, вы имеете в виду, что мне нужно поменять service-name на что-то другое.   -  person kramer65    schedule 16.05.2019
comment
@MehdiBenmoha - Я использую pm2 версию 3.4.1. Я тоже добавил к вопросу.   -  person kramer65    schedule 16.05.2019
comment
@ kramer65 - Нет. Не буквально. Вызвать команду с именем службы. Скорее всего, это pm2-kramer65.service, поэтому он становится journalctl -u pm2-kramer65.service   -  person suv    schedule 16.05.2019
comment
Под моим Target path в моем первом выводе написано, что он написал /etc/systemd/system/pm2-kramer65.service, поэтому я запустил journalctl -u pm2-kramer65.servicesudo и без него) и получил то же самое, что и раньше. Либо insufficient permissions, либо -- No entries --. Любые идеи?   -  person kramer65    schedule 16.05.2019
comment
Также, если у вас есть process.yml, опубликуйте его. И файл pm2 config.js в $HOME/.pm2/conf.js   -  person suv    schedule 16.05.2019
comment
Какой результат systemctl list-unit-files --all?   -  person suv    schedule 16.05.2019
comment
Вам нужно добавить все зависимости в этот раздел After = network.target. Какие типы услуг использует это приложение?   -  person Dilyan Trayanov    schedule 16.05.2019
comment
@suv - для systemctl list-unit-files --all много вывода, и pm2-kramer65.service enabled - один из них. Это происходит как после перезагрузки машины (когда эхо находится в состоянии errored), так и после остановки и запуска эха, чтобы заставить его снова работать.   -  person kramer65    schedule 16.05.2019
comment
@suv - $HOME/.pm2/conf.js не существует. ~/.pm2/module_conf.json существует, но содержит только пустой объект json ({}). Я не могу найти ни одного process.yml файла. Где это могло быть?   -  person kramer65    schedule 16.05.2019
comment
@ kramer65 Какую команду вы используете с pm2? Можете ли вы вставить результат pm2 info echo, особенно первую часть описания процесса?   -  person Mat    schedule 17.05.2019


Ответы (1)


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

Что env <command> делает? (Крис Джонсен)

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) программа

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

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

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

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

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

  • команда startups просто установит pm2 для запуска при загрузке (Startup Cli Commands)
  • команда systemd используется для поддерживаемых систем инициализации Ubuntu => 16, CenOS >=7, Arch, Debian >=7 (Совместимость с обработчиками запуска), и его следует изменить на правильный platform, как указано в прилагаемых документах.

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

со средой, образованной путем расширения текущей среды с помощью переменных и значений среды, обозначенных как name = value и name2 = value2.

По pm2 docs должна быть папка внутри /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

Дополнительную информацию можно найти на и в соответствующем обсуждении

person Fabrizio Bertoglio    schedule 17.05.2019
comment
Спасибо за развернутый ответ. Мне потребовалось время, чтобы это осознать. Я просто не понимаю, что вы имеете в виду под the other one is a recent version located in ./nodejs/node. Это относительный путь. Я провел поиск в своей системе (sudo find / -name *node*) и не нашел другой версии узла. Или он просто ищет другую версию узла, которую не находит. Не могли бы вы мне еще намекнуть, где это может пойти не так? - person kramer65; 24.05.2019
comment
@ kramer65 извини, я летел на 18 часов. Я отвечаю с мобильного устройства. Я процитировал сообщение из обсуждения. Кажется, он не находит папку для /usr/local/share/.config/yarn/global/node_modules/pm2/bin/pm2 в дочернем процессе y? Y проезжают домой пользователя --hp /home/kramer, но пряжа установка зависимостей за пределами домашней папки y. Я бы подумал об обновлении пряжи и узла - person Fabrizio Bertoglio; 26.05.2019
comment
Я не верю, что проблема заключается в --hp варианте, но ваш systemmd не находит папку по пути pm2 - person Fabrizio Bertoglio; 26.05.2019
comment
Эта проблема может быть решена после лучшего понимания того, как работает systemmd, создания сеанса терминала в systemmd и тестирования этих команд. - person Fabrizio Bertoglio; 26.05.2019