Почему 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 error и логов
- Основные причины остановки PM2 демона
- Решения для PM2 Ubuntu на старой версии
- Настройка автозапуска и сохранения процессов
- Предотвращение крашей из-за памяти
- Источники
- Заключение
Почему 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.
- Сигналы от ОС. OOM killer бьёт по PM2, если Node жрёт >80% swap. Старые Ubuntu с малым RAM — идеал для этого.
- SIGINT в apps.
pm2 delete appили Ctrl+C в терминале — и привет, полный рестарт демона, все процессы down. - Ребуты сервера. VPS перезагружается (обновления, OOM), PM2 теряет статус. В DigitalOcean гайде предупреждают: без
pm2 startup— самоликвидация. - Старый PM2/Node. Версия 2.0.12 на Ubuntu 16.04 — комбо для крашей, как в issue #2396.
- 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 файл для продвинутых:
{
"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.
Источники
- PM2 keeps randomly crashing · Issue #2396 · Unitech/pm2
- My node processes keep crashing and don’t restart · Issue #4623 · Unitech/pm2
- pm2 process crashed on server. it gives an error - Stack Overflow
- How to Use PM2 to Setup a Node.js Production Environment on Ubuntu VPS | DigitalOcean
- How to stop a pm2 process from systemctl - Ask Ubuntu
- Pm2 process stops running - Stack Overflow
Заключение
PM2 крашится на Ubuntu в основном от OOM, сигналов и отсутствия автосейва — но фиксится обновлением, pm2 save/startup и лимитами памяти за 15 минут по SSH. Тестируйте на staging VPS, настройте логи — и ваш server.js будет жить вечно, даже на старой Ubuntu. Главное: не игнорируйте dmesg, оно спасёт от 90% бед. Теперь ваш Node продакшн стабилен!