У меня есть скрипт узла, который запускает дочерние процессы. Я хочу убедиться, что все они завершены, когда мой скрипт завершен, нормально ли он заканчивается (не должно быть никаких дочерних процессов, оставшихся до убийства) или нет (это то, где я должен что-то делать).Как я могу обнаружить, что мой 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
$
Различное поведение.
Я уверен, что навсегда не зацепится up stdin для процесса узла, поэтому он не получает выход - вам нужно остановить его с помощью 'forever stop index.js'. Проверьте вечные журналы, по умолчанию в '~ /.forever/ '- также,' everever list', чтобы отобразить запущенные, контролируемые процессы и их файл журнала. –
furydevoid
@furydevoid 'forever list' не перечисляет мой процесс. Также нет '~/.forever/'. Попробуйте это для себя с помощью приведенного выше кода. –
Shawn
О, и 'forever stop' ожидает pid, а не имя файла – Shawn