PM2 процесс сбрасывается на Ubuntu: причины и решения
Полное руководство по устранению проблем с PM2 на Ubuntu. Причины сброса процессов, настройка автозапуска, конфликты версий Node.js и решения для старых VPS.
Почему PM2 сбрасывает процесс server.js на VPS с Ubuntu? Прямой запуск ‘node server.js’ работает стабильно, но PM2 демон останавливается. Возможные причины и способы решения для старой версии Ubuntu с доступом только по SSH
PM2 Ubuntu процесс сбрасывается из-за проблем с автозапуском при перезагрузке сервера, конфликтами версий Node.js или неправильной настройкой демона. Прямой запуск node server.js работает стабильно, потому что он не зависит от системного менеджера процессов, в то время как PM2 требует правильной конфигурации и сохранения списка процессов для корректной работы после перезагрузки.
Содержание
- Основные причины сбрасывания процессов PM2
- Проблемы с автозапуском при перезагрузке
- Конфликты версий Node.js
- Проблемы с памятью и зависаниями
- Настройка SSH сессий и PM2
- Решения и пошаговые инструкции
- Диагностика и мониторинг
- Источники
- Заключение
Основные причины сбрасывания процессов PM2
PM2 демон останавливается на Ubuntu по нескольким ключевым причинам, которые часто игнорируют при первоначальной настройке. Самая распространенная проблема - отсутствие правильной настройки автозапуска. Когда сервер перезагружается, PM2 не автоматически восстанавливает свои процессы. Это происходит потому что демон PM2 сам останавливается при перезагрузке, а список процессов не сохраняется для последующего восстановления.
Другая частая причина - конфликт версий Node.js. Системная версия Node.js может отличаться от той, которая используется в вашем приложении. PM2 использует системную версию для запуска процессов, что приводит к ошибкам совместимости, особенно если ваше приложение требует более новую версию Node.js.
Проблемы с памятью также могут вызывать сбрасывание процессов. PM2 автоматически проверяет использование памяти каждые 30 секунд. Если процесс превышает установленный лимит, PM2 перезапускает его. На старых VPS с ограниченными ресурсами это может происходить даже при нормальной нагрузке.
Интересный факт: Многие разработчики не знают, что PM2 использует системную версию Node.js, а не ту, что установлена через nvm или другую систему управления версиями.
Проблемы с автозапуском при перезагрузке
Настройка автозапуска PM2 - критически важный шаг, который часто упускают. Без правильной настройки ваши процессы не будут восстанавливаться после перезагрузки сервера. Процесс настройки включает несколько команд:
# Сначала запустите ваше приложение
pm2 start server.js
# Сохраните текущий список процессов
pm2 save
# Настройте автозапуск при загрузке системы
pm2 startup systemd -u your_username --hp /home/your_username
Частая ошибка - выполнение этих команд в неправильном порядке или без сохранения списка процессов перед настройкой автозапуска. Результат - процессы PM2 не запускаются при перезагрузке, и вы видите пустой список при выполнении pm2 ls.
Если вы пропустили шаг pm2 save, демон PM2 не будет знать о существующих процессах и не сможет их восстановить. Это особенно важно на старых версиях Ubuntu, где система инициализации может работать иначе, чем на современных дистрибутивах.
Конфликты версий Node.js
Версионные конфликты Node.js - тихий убийца ваших PM2 процессов. Прямой запуск node server.js работает, потому что вы явно используете системную версию Node.js. Но когда PM2 пытается запустить процесс, он может использовать другую версию, вызывая непредсказуемые ошибки.
Проверьте версию Node.js, которую используете для прямого запуска:
node --version
Теперь проверьте, какую версию использует PM2:
which node
Если версии отличаются, PM2 будет использовать системную версию, которая может не соответствовать требованиям вашего приложения. Это особенно актуально на старых Ubuntu, где системная версия Node.js часто устаревает.
Решение - установите правильную версию Node.js системно или используйте абсолютный путь в конфигурации PM2:
// ecosystem.config.js
module.exports = {
apps: [{
name: 'server',
script: 'server.js',
interpreter: '/usr/bin/node' // или другой путь к нужной версии
}]
}
Проблемы с памятью и зависаниями
На старых VPS с ограниченными ресурсами проблемы с памятью становятся особенно заметны. PM2 автоматически мониторит использование памяти и перезапускает процессы при превышении лимитов. По умолчанию лимит составляет 1 ГБ, но это может быть слишком много для вашего VPS.
Проверьте текущие лимиты памяти для ваших процессов:
pm2 info server_name
Если вы видите предупреждения о превышении памяти, установите разумные ограничения:
// в ecosystem.config.js
module.exports = {
apps: [{
name: 'server',
script: 'server.js',
max_memory_restart: '500M' // лимит в 500 МБ
}]
}
Еще одна проблема - утечки памяти в самом приложении. PM2 может зависнуть при попытке перезапуска процесса с высокой нагрузкой. В таких случаях помогает перезапуск самого демона PM2:
pm2 kill
# затем перезапустите необходимые процессы
Настройка SSH сессий и PM2
При доступе только по SSH важно понимать, что PM2 работает как системный демон, а не как часть вашей SSH сессии. Когда вы выходите из SSH, процессы, запущенные в рамках этой сессии, могут останавливаться, если они не настроены как системные сервисы.
Решение - настройте PM2 для работы как системный сервис. Это гарантирует, что процессы будут продолжать работать независимо от активности SSH сессий:
# Убедитесь, что PM2 запущен как системный сервис
pm2 startup
# Сохраните текущий список процессов
pm2 save
# Проверьте статус автозапуска
pm2 startup
Если вы используете старую Ubuntu (14.04 или 16.04), возможно, потребуется дополнительная настройка systemd. В этом случае используйте:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u your_username --hp /home/your_username
Решения и пошаговые инструкции
Полная настройка PM2 для автозапуска
- Остановите все процессы PM2 (если они запущены):
pm2 stop all
pm2 kill
- Запустите ваше приложение:
pm2 start server.js --name "my-app"
- Сохраните список процессов:
pm2 save
- Настройте автозапуск:
pm2 startup systemd -u your_username --hp /home/your_username
-
Скопируйте и выполните сгенерированную команду (она будет выведена в консоли)
-
Перезагрузите сервер для проверки:
sudo reboot
- Проверьте статус после перезагрузки:
pm2 ls
Восстановление потерянных процессов
Если процессы исчезли после перезагрузки, попробуйте восстановить их:
# Восстановите сохраненные процессы
pm2 resurrect
# Если resurrect не работает, проверьте системные логи
journalctl -u pm2-your_username.service
# Или проверьте логи PM2
pm2 logs
Обновление PM2
Устаревшая версия PM2 может вызывать проблемы. Обновите ее:
# Обновите PM2 глобально
npm install pm2@latest -g
# Обновите процессы в памяти
pm2 update
Диагностика и мониторинг
Для эффективного устранения проблем используйте встроенные инструменты диагностики PM2:
# Проверка статуса процессов
pm2 ls
# Просмотр логов
pm2 logs
# Мониторинг в реальном времени
pm2 monit
# Информация о процессе
pm2 info process_name
# Проверка использования ресурсов
pm2 describe process_name
Если PM2 завис или не отвечает, используйте более агрессивные методы:
# Принудительное завершение всех процессов PM2
pm2 kill
# Перезапуск демона
pm2 resurrect
# Проверка системных сервисов
systemctl status pm2-your_username.service
Совет: Настройте мониторинг логов PM2 с помощью
pm2 logs --lines 100для быстрого обнаружения ошибок.
Источники
- PM2 Restart Strategies — Официальная документация по стратегиям перезапуска PM2 и мониторингу памяти: https://pm2.keymetrics.io/docs/usage/restart-strategies/
- PM2 Process Stops Running — Решение проблем с остановкой процессов PM2 при перезагрузке сервера: https://stackoverflow.com/questions/32976469/pm2-process-stops-running
- PM2 Startup Configuration — Пошаговая настройка автозапуска PM2 на Ubuntu: https://stackoverflow.com/questions/34821063/pm2-startup-not-starting-up-on-ubuntu
- PM2 Process Recovery - Восстановление процессов PM2 после перезагрузки системы: https://stackoverflow.com/questions/45412600/pm2-process-disappears-after-reboot
- PM2 SSH Session Issues - Решение проблем с SSH сессиями и PM2: https://www.reddit.com/r/devops/comments/1j6z253/pm2_process_exits_after_ssh_session_ends_when/
- PM2 Memory Management - Диагностика и решение проблем с памятью в PM2: https://stackoverflow.com/questions/48109137/pm2-hangs-and-unable-to-restart-process-due-to-high-numbers-of-request
- PM2 Version Conflicts - Устранение конфликтов версий Node.js при работе с PM2: https://stackoverflow.com/questions/50519387/pm2-shows-old-version-when-re-building-app
- PM2 Update Process - Инструкция по обновлению PM2 и восстановлению процессов: https://ploi.io/documentation/server/how-do-i-update-pm2
Заключение
PM2 Ubuntu процесс сбрасывается из-за нескольких ключевых проблем, которые можно решить правильной настройкой. Основные причины - отсутствие автозапуска при перезагрузке, конфликты версий Node.js и проблемы с памятью. Для стабильной работы всегда выполняйте команды pm2 save и pm2 startup в правильном порядке. На старых версиях Ubuntu может потребоваться дополнительная настройка systemd. Регулярно мониторьте логи PM2 и обновлявайте версию менеджера процессов для избежания неожиданных сбоев. Следуя этим рекомендациям, вы обеспечите надежную работу вашего server.js приложения под управлением PM2 даже на старых VPS с ограниченным доступом.