Я пишу сценарий инициализации для моего приложения Node.js, которое работает с использованием навсегда. Forever — это сам демон, который запускает процесс узла под ним.
Моя проблема заключается в том, что при сбое приложения Node.js сценарий инициализации не улавливает это, поскольку навсегда всегда возвращает 0.
Я начинаю навсегда следующим образом: $FOREVER start --pidFile $PIDFILE -al $LOGFILE -ao $OUTFILE -ae $ERRFILE $SERVER
Когда Node.js запускается правильно и я делаю список, я получаю:
# forever list
info: Forever processes running
data: uid command script forever pid logfile uptime
data: [0] UP0C /usr/bin/node /some/path/here/server.js 27322 27324 /root/.forever/UP0C.log 0:0:6:3.493
Когда он падает, я вижу:
# forever list
info: Forever processes running
data: uid command script forever pid logfile uptime
data: [0] QFel /usr/bin/node /some/path/here/server.js 27578 27580 /root/.forever/QFel.log 0:0:1:6.207
Как видите, разницы почти нет. Когда я смотрю этот файл журнала, показанный в выводе, я вижу ошибку, которую выдает узел. Я увижу error: Forever detected script exited with code: 8
в конце.
Проверяя pid отказавшего процесса Node, я вижу:
# ps aux | grep 27580
root 27671 0.0 0.0 103240 840 pts/0 S+ 18:37 0:00 grep 27580
Процесс находится в спящем состоянии. Почему навсегда это не ловит и что это за процесс, который спит? Почему он просто не выходит?
Другими словами, используя навсегда, как я могу обнаружить, что процесс, который пытался запустить навсегда, не удался? Почему у навсегда нет простого способа справиться с этим? Разве навсегда не предназначен, по сути, для управления запуском и остановкой приложений Node? Проверка того, действительно ли процесс запущен, должна быть одной из краеугольных функций.