2015-09-13 7 views
3

У меня есть скрипт узла, который запускает дочерние процессы. Я хочу убедиться, что все они завершены, когда мой скрипт завершен, нормально ли он заканчивается (не должно быть никаких дочерних процессов, оставшихся до убийства) или нет (это то, где я должен что-то делать).Как я могу обнаружить, что мой Node.js-скрипт завершается навсегда?

Я думал об использовании process.on('exit', fn), но я заметил, что fn не вызывается, когда мой скрипт был запущен forever (forever myScript.js). Это называется, однако, когда я запускаю свой сценарий нормально (node myScript.js).

Я продолжил, чтобы попытаться найти сигнал я мог прослушивать, но ни одно из следующих действий, кажется, не уволят: SIGUSR1, SIGTERM, SIGPIPE, SIGHUP, SIGTERM, SIGINT, SIGBREAK, SIGWINCH

Я также попытался с process.on('beforeExit', ...), но это также не срабатывает.

Вот скрипт я использую, чтобы проверить это (только представьте себе, что вместо того, чтобы войти какой-нибудь текст, я бы убить все оставшиеся дочерние процессы):

myScript.js

console.log('started') 

process.on('beforeExit', function() { 
    console.log('beforeExit fired') 
}) 
process.on('exit', function() { 
    console.log('exit fired') 
}) 

// signals 
process.on('SIGUSR1', function() { 
    console.log('SIGUSR1 fired') 
    process.exit(1) 
}) 
process.on('SIGTERM', function() { 
    console.log('SIGTERM fired') 
    process.exit(1) 
}) 
process.on('SIGPIPE', function() { 
    console.log('SIGPIPE fired') 
}) 
process.on('SIGHUP', function() { 
    console.log('SIGHUP fired') 
    process.exit(1) 
}) 
process.on('SIGTERM', function() { 
    console.log('SIGTERM fired') 
    process.exit(1) 
}) 
process.on('SIGINT', function() { 
    console.log('SIGINT fired') 
    process.exit(1) 
}) 
process.on('SIGBREAK', function() { 
    console.log('SIGBREAK fired') 
}) 
process.on('SIGWINCH', function() { 
    console.log('SIGWINCH fired') 
}) 

// Let's keep the process open long enough to kill it manually 
setTimeout(function() {}, 5000) 

Давайте попробуем это запустив сценарий и убив его Ctrl-C до 5 секунд. Первый «обычно»:

$ node index.js 
started 
^CSIGINT fired 
exit fired 
$ 

Это ведет себя так, как я ожидаю. Теперь давайте попробуем с вечно:

$ forever index.js 
warn: --minUptime not set. Defaulting to: 1000ms 
warn: --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms 
started 
^C 
$ 

Различное поведение.

+0

Я уверен, что навсегда не зацепится up stdin для процесса узла, поэтому он не получает выход - вам нужно остановить его с помощью 'forever stop index.js'. Проверьте вечные журналы, по умолчанию в '~ /.forever/ '- также,' everever list', чтобы отобразить запущенные, контролируемые процессы и их файл журнала. – furydevoid

+0

@furydevoid 'forever list' не перечисляет мой процесс. Также нет '~/.forever/'. Попробуйте это для себя с помощью приведенного выше кода. – Shawn

+0

О, и 'forever stop' ожидает pid, а не имя файла – Shawn

ответ

2

Когда вы отправляете cntl-C из командной строки, forever получает SIGINT. Вы взорвали forever, а не вашу программу напрямую, поэтому я не обязательно буду ожидать, что ваша программа начнет работать с exit обработчиком событий.

Если вы изменили свой setTimeout, чтобы взорвать вашу программу (например, setTimeout(function() { undefined(); }, 500)), вы увидите, что обработчик событий exit действительно запущен. Они указывают, что TypeError, введенный в эту строку кода (где он пытается обрабатывать undefined, как функция) убивает вашу программу, но не убивает навсегда.

Аналогично, если ваша программа выходит изящно, событие exit также срабатывает, даже когда программа запускается с forever.

Так что я думаю, что вы можете ожидать process.on('exit'); стрелять, даже если ваша программа была запущена и контролируется forever, пока forever сам не завершается неожиданно. (Это проблема только в том случае, если она неожиданно прекращается. Если forever изящно останавливает вашу программу, скажем forever stop, тогда это не будет проблемой. exit событие будет срабатывать.)

+0

Когда навсегда неожиданно неожиданно, мой процесс также заканчивается правильно? Невозможно это обнаружить? Или мой процесс, возможно, сохранится навсегда, если его прекратят? – Shawn

+1

Я думаю, вам нужно будет добавлять обработчики событий SIG навсегда, которые будут отправлять один и тот же сигнал дочернему процессу (ваш скрипт), когда он получен –

+0

Возможно, это относится к трекеру Node.js: https://github.com/ nodejs/узел/вопросы/2853 – Trott

Смежные вопросы