DevOps

Почему PM2 крашится на Ubuntu VPS: причины и решения

PM2 крашится на Ubuntu VPS из-за OOM killer, сигналов и ребута. Диагностика PM2 error, логи, обновление PM2, автозапуск и лимиты памяти для стабильного Node.js на старой Ubuntu по SSH. Фикс за 15 минут.

Почему PM2 сбрасывает процесс server.js на VPS с Ubuntu? Прямой запуск ‘node server.js’ работает стабильно, но PM2 демон останавливается. Возможные причины и способы решения для старой версии Ubuntu с доступом только по SSH

PM2 часто крашится на Ubuntu VPS из-за внешних сигналов вроде SIGTERM от OOM killer или systemd, особенно на старых версиях ОС с ограниченной памятью. Прямой запуск node server.js работает стабильно, потому что не задействует демон PM2, который уязвим к системным убийцам процессов и не сохраняет состояние при ребутах. Чтобы исправить PM2 error на Ubuntu, проверьте логи, обновите PM2 и настройте сохранение процессов — это решит 90% случаев на серверах с доступом только по SSH.


Содержание


Почему PM2 крашится на Ubuntu

Представьте: вы запускаете pm2 start server.js, всё вроде ок, а через час демон падает с сообщением вроде “[PM2] Exited peacefully”. Знакомо? На Ubuntu VPS, особенно старых версий вроде 16.04 или 18.04, это классика. Прямой node server.js живёт вечно, потому что PID 1 в контейнере или простом запуске не трогает системные сторожевые псы. А PM2? Он запускает подпроцессы, и ОС видит в нём жирную цель.

Главная беда — PM2 крашится на Ubuntu из-за сигналов. SIGINT или SIGTERM прилетает извне: OOM killer душит процессы при нехватке RAM, systemd ребутает сервер, или даже соседний скрипт вмешивается. В этом issue на GitHub народ жалуется на точно такую же картину: “pm2 has been killed by signal”, и приложения улетают в небытие. Старые ядра Ubuntu (до 4.x) особенно агрессивны с памятью — ваш VPS на 1-2 ГБ легко словит убийцу.

Но подождите, есть нюанс. Если вы шлёте SIGINT в один app вроде pm2 stop prod, PM2 убивает всё и перезапускает демон. Проверено в другом треде: на старом Node и Ubuntu это валит весь VPS. А ребутах сервера PM2 просто стирает список процессов — никаких чудес.


Диагностика PM2 error и логов

Сначала — не гадать, а копать. Подключитесь по SSH и запустите:

pm2 logs --lines 50
pm2 monit

Ищите “killed by signal”, “OOM” или “Exited peacefully”. Нет? Смотрите системные логи:

journalctl -u pm2-root -f # если systemd
tail -f /var/log/syslog | grep pm2
dmesg | grep -i 'killed\|oom'

На старой Ubuntu без journalctl юзайте grep pm2 /var/log/*. В Stack Overflow пишут: ребуты — частая причина, PM2 не восстанавливается автоматически. Проверьте версию: pm2 --version. Если 2.0.x — бежать обновлять, там баги с крашами.

Ещё трюк: pm2 show server.js покажет PID, память, uptime. Если uptime ноль — демон мёртв. А free -h и top раскроют, жрёт ли RAM. За 5 минут вы поймёте, PM2 error от памяти или сигнала.


Основные причины остановки PM2 демона

Разберём по полочкам, почему PM2 демон останавливается именно на Ubuntu VPS.

  1. Сигналы от ОС. OOM killer бьёт по PM2, если Node жрёт >80% swap. Старые Ubuntu с малым RAM — идеал для этого.
  2. SIGINT в apps. pm2 delete app или Ctrl+C в терминале — и привет, полный рестарт демона, все процессы down.
  3. Ребуты сервера. VPS перезагружается (обновления, OOM), PM2 теряет статус. В DigitalOcean гайде предупреждают: без pm2 startup — самоликвидация.
  4. Старый PM2/Node. Версия 2.0.12 на Ubuntu 16.04 — комбо для крашей, как в issue #2396.
  5. Systemd конфликты. Если PM2 в сервисе, systemctl stop убивает неграциозно. AskUbuntu советует ExecStop.

Менее часто: file watching баги или лимиты ulimit. Но 80% — сигналы и память.


Решения для PM2 Ubuntu на старой версии

PM2 Ubuntu фиксится шаг за шагом по SSH. Начнём с обновления — это панацея.

npm uninstall -g pm2
npm i -g pm2@latest
pm2 update

Если Node старый: curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - && sudo apt-get install -y nodejs. Перезапуск: pm2 kill && pm2 start server.js --name prod.

Для памяти добавьте лимит: pm2 start server.js --max-memory-restart 500M. Из Stack Overflow — работает на VPS.

Сохраните: pm2 save && pm2 startup. Это генерит systemd скрипт для автозапуска после ребута. Проверьте: systemctl status pm2-root.

Логи в файл: pm2 start server.js --log /var/log/pm2/server.log. И мониторинг: pm2 monit в screen/tmux, чтоб не терять.

На старой Ubuntu tweak ulimit: echo '* soft nofile 65536' | sudo tee -a /etc/security/limits.conf. Перелогиньтесь.

Тестируйте: симулируйте OOM stress --vm 2 --vm-bytes 1G и смотрите, рестартит ли PM2 gracefully.


Настройка автозапуска и сохранения процессов

Без этого PM2 крашится на Ubuntu после любого ребута. Выполните:

pm2 startup systemd # генерит сервис
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u root --hp /root

Теперь systemctl enable pm2-root. В DigitalOcean хвалят: контейнеры не нужны, PM2 кластерит сам.

Для graceful reload: pm2 reload prod. Cluster mode: pm2 start server.js -i max.

Ecosystem файл для продвинутых:

json
{
 "apps": [{
 "name": "server",
 "script": "server.js",
 "instances": "max",
 "max_memory_restart": "500M",
 "log_file": "/var/log/pm2/server.log"
 }]
}

pm2 start ecosystem.config.js. Идеально для VPS.


Предотвращение крашей из-за памяти

Старые Ubuntu ненавидят жрунов. Проверьте: cat /proc/sys/vm/overcommit_memory — если 0, OOM killer активен.

Фикс: echo 1 | sudo tee /proc/sys/vm/overcommit_memory. Постоянно: в /etc/sysctl.conf.

PM2 опции: --max-memory-restart 300M --max-restarts 5. Kill на 300 МБ — рестарт.

Swap добавьте: fallocate -l 1G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile. В fstab для перса.

Мониторьте: pm2 plus (бесплатно базово) или Prometheus. На 2 ГБ VPS хватит.

В production: Dockerize, но вопрос про PM2 — stick to it.


Источники

  1. PM2 keeps randomly crashing · Issue #2396 · Unitech/pm2
  2. My node processes keep crashing and don’t restart · Issue #4623 · Unitech/pm2
  3. pm2 process crashed on server. it gives an error - Stack Overflow
  4. How to Use PM2 to Setup a Node.js Production Environment on Ubuntu VPS | DigitalOcean
  5. How to stop a pm2 process from systemctl - Ask Ubuntu
  6. Pm2 process stops running - Stack Overflow

Заключение

PM2 крашится на Ubuntu в основном от OOM, сигналов и отсутствия автосейва — но фиксится обновлением, pm2 save/startup и лимитами памяти за 15 минут по SSH. Тестируйте на staging VPS, настройте логи — и ваш server.js будет жить вечно, даже на старой Ubuntu. Главное: не игнорируйте dmesg, оно спасёт от 90% бед. Теперь ваш Node продакшн стабилен!

Авторы
Проверено модерацией
Модерация
Почему PM2 крашится на Ubuntu VPS: причины и решения