Приложение Node.js не поднимается после перезагрузки
Менеджеры процессов для приложений на Node.js держат свой список запущенного и предлагают создать службу автозапуска. Ошибка возникает, когда служба создана, а список не сохранён: после перезагрузки менеджер стартует пустым. Для сервера чище обойтись обычным unit-файлом.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Список запущенного не сохранён
Менеджер восстанавливает список из файла. Без сохранения после перезагрузки запускать ему нечего.
-
Служба автозапуска создана для другого пользователя
Служба привязана к пользователю, от которого её создавали. Список другого пользователя она не увидит.
-
Менеджер процессов дублирует работу systemd
Перезапуск при сбое, журналы, ограничения ресурсов — всё это systemd умеет сам. Второй менеджер добавляет слой без пользы.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Что менеджер считает запущенным сейчас.
pm2 listКак выглядит созданная им служба автозапуска.
systemctl cat "pm2-*" 2>/dev/null | head -20Что происходило при загрузке.
journalctl -u "pm2-*" -b --no-pager | tail -20Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Менеджер восстанавливает список из файла. Без сохранения после перезагрузки запускать ему нечего.
- Как проверить
-
Посмотрите список и файл сохранения.
pm2 list 2>/dev/null ls -l ~/.pm2/dump.pm2 2>/dev/null
- Как исправить
- Сохраните список после изменений. Каждое добавление приложения требует повторного сохранения — это легко забыть.
- Почему происходит
- Служба привязана к пользователю, от которого её создавали. Список другого пользователя она не увидит.
- Как проверить
-
Посмотрите созданную службу и её пользователя.
systemctl cat "pm2-*" 2>/dev/null | grep -E "^(User|Environment|ExecStart)" | head systemctl is-enabled "pm2-*" 2>/dev/null
- Как исправить
- Создавайте службу от того пользователя, который запускает приложения, либо явно укажите его домашний каталог в окружении службы.
- Почему происходит
- Перезапуск при сбое, журналы, ограничения ресурсов — всё это systemd умеет сам. Второй менеджер добавляет слой без пользы.
- Как проверить
-
Посмотрите, что делает менеджер помимо запуска.
pm2 describe myapp 2>/dev/null | head -20
- Как исправить
-
Напишите обычный unit-файл: перезапуск задаётся
Restart=on-failure, журнал идёт в journalctl, число процессов задаётся приложением. Схема становится прозрачной.
Пример вывода
Служба автозапуска есть, список пуст. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd[1]: Started pm2-deploy.service - PM2 process manager.
pm2[820]: [PM2] Resurrecting
pm2[820]: [PM2][WARN] No processes saved; DUMP file doesn't exist
systemd[1]: pm2-deploy.service: Deactivated successfully.
Связанные ошибки
- Node-служба не видит переменные окружения Приложение падает из-за отсутствующих переменных: файл .env не читается службой, окружение задаётся иначе.
- Служба пользователя не запускается или не переживает выход systemctl --user: служба останавливается при выходе из системы. Разбор lingering и отличий от системных служб.
- Таймер не работает после перезагрузки Таймер работал, пока его запускали вручную, но после перезагрузки не активен: не выполнено включение или нет WantedBy=timers.target.
- Unit is masked: служба запрещена к запуску Сообщение Unit is masked: unit заблокирован ссылкой на /dev/null. Как найти и снять маскировку.
- Unit … has no installation config: не включается автозапуск systemctl enable отказывает: в unit-файле нет секции [Install] или WantedBy. Как включить службу в автозапуск правильно.
- WantedBy= в неверной секции: автозапуск не работает Параметр WantedBy= указан в [Unit] вместо [Install]. Служба запускается вручную, но не поднимается после перезагрузки.
- Автозапуск настроен ссылкой вручную Ссылка создана руками вместо systemctl enable: чем это отличается и когда ломается.
- Служба включается или отключается сама после установки пакета Наборы предустановок решают, включать ли службу при установке. Как посмотреть и переопределить.
Источники
- Документация PM2: автозапуск
-
systemd.service(5)
Перезапуск при сбое и автозапуск обычной службы. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено созданием службы автозапуска без сохранения списка.