gpt4 book ai didi

javascript - 我怎样才能检测到我的 Node.js 脚本被永远终止了?

转载 作者:搜寻专家 更新时间:2023-10-31 23:53:34 26 4
gpt4 key购买 nike

我有一个启动子进程的 Node 脚本。我想确保它们在我的脚本终止时全部终止,无论它是否正常终止(不应该有任何子进程要杀死)或不终止(这是我希望必须做某事的地方)。

我想过使用 process.on('exit', fn),但我注意到当我的脚本由 forever 启动时,fn 没有被调用。 (永远的 myScript.js)。但是,当我正常运行我的脚本 (node myScript.js) 时,它调用。

我继续尝试寻找我可以监听的信号,但似乎没有触发以下信号:SIGUSR1SIGTERMSIGPIPE, 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)

让我们通过启动脚本并在 5 秒结束前使用 Ctrl-C 终止它来尝试一下。首先“通常”:

$ 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
$

不同的行为。

最佳答案

当您从命令行发送 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 事件将触发。)

关于javascript - 我怎样才能检测到我的 Node.js 脚本被永远终止了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32553494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com