Вечно не показывает запущенные процессы должным образом

Я пишу сценарий инициализации для моего приложения 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? Проверка того, действительно ли процесс запущен, должна быть одной из краеугольных функций.


person darksky    schedule 24.06.2014    source источник
comment
Я предполагаю, что ваше приложение node на самом деле не умирает. Возможно ли, что что-то поддерживает его жизнь? Я сам использую навсегда и могу убедиться, что он работает по назначению, если процесс узла остановится.   -  person tier1    schedule 24.06.2014
comment
Я помещаю синтаксическую ошибку в начало своего файла, и я вижу синтаксическую ошибку Node в файле, и он говорит, что обнаруженный навсегда сценарий завершился с кодом 8. Это означает, что приложение Node завершилось. Ваш навсегда также возвращает ненулевое значение или как вы это обнаруживаете?   -  person darksky    schedule 24.06.2014
comment
Обратите внимание, что ваш идентификатор процесса изменился после запуска «вечного списка» после сбоя. Я думаю, что ваш скрипт запускается правильно, однако навсегда прекратит попытки перезапуска, если ваше приложение выйдет из строя в течение первых нескольких секунд выполнения. Это может быть то, с чем вы сталкиваетесь здесь.   -  person tier1    schedule 24.06.2014
comment
Это изменилось, потому что это два разных пробега. Один правильный, а другой имеет синтаксические ошибки.   -  person darksky    schedule 25.06.2014
comment
@tier1 Ваш навсегда возвращает ненулевое значение, если приложение узла выходит из строя? Ты на самом деле спишь? Потому что приложение узла вылетает при запуске, которое возвращается навсегда. Так что я не думаю, что ваше навсегда действительно возвращает ненулевое значение. Как вы с этим справляетесь?   -  person darksky    schedule 25.06.2014


Ответы (1)


Вы также можете взглянуть на NON cli-версию навсегда под названием:

forever-monitor 
https://github.com/nodejitsu/forever-monitor

который предоставляет все необходимые события для подписки, например:

error [err]: Raised when an error occurs
start [process, data]: Raised when the target script is first started.
stop [process]: Raised when the target script is stopped by the user
restart [forever]: Raised each time the target script is restarted
exit [forever]: Raised when the target script actually exits (permenantly).
stdout [data]: Raised when data is received from the child process' stdout
stderr [data]: Raised when data is received from the child process' stderr
person Scott Stensland    schedule 24.06.2014