我有一个节点脚本,我从命令行永远运行:forever index.js
当该脚本崩溃时,我希望永远重启它,但不是所有时间。在某些情况下,我知道需要人工干预来修复。在这些情况下,我希望能够以永远不会重新启动它的方式退出流程。
有没有办法做到这一点?
我原本以为我可以使用process.exit(1)
重新启动流程,但不会使用process.exit(0)
重新启动,但显然情况并非如此。
这是另一种说法:
forever index.js
脚本应打印“hello”,退出,不要重新启动
setTimeout(function () {
console.log("hello")
// YOUR CODE GOES HERE
}, 1500)
顺便说一句,那里的延迟只是默认的工作--minUpTime为1秒
答案 0 :(得分:2)
forever 使用--killSignal选项支持退出信号自定义:
--killSignal Support exit signal customization (default is SIGKILL),
used for restarting script gracefully e.g. --killSignal=SIGTERM
以上是用于永远指示哪个kill信号停止脚本永远开始。要根据脚本退出的方式选择性地停止运行脚本,您需要使用forever-monitor。
首先,当你想永远不重启它时,你的脚本需要发送一个特定的信号。这是我们的script.js:
setTimeout(function () {
console.log('hello');
//process.kill(process.pid, 'SIGKILL'); // this will cause forever to restart the script.
setTimeout(function () {
process.kill(process.pid, 'SIGTERM'); // this will cause forever to stop the script.
}, 1000);
}, 2000);
然后,我们需要一个带有forever-monitor的附加脚本(让我们称之为 script-monitor.js ):
var forever = require('forever-monitor');
var child = new (forever.Monitor)('script.js', {
max: 10,
silent: false,
args: []
});
child.on('restart', function() {
console.error('Forever restarting script for ' + child.times + ' time');
});
child.on('exit:code', function(code) {
console.error('Forever detected script exited with code ' + code);
if (143 === code) child.stop(); // don't restart the script on SIGTERM
});
child.start();
现在您可以通过运行:node script-monitor.js
为方便起见,node.js中的here is a list信号事件。
答案 1 :(得分:0)
按照@Marco的回答,但是不需要发信号。可以将其替换为您选择的退出代码(例如0)。代码如下:
script.js
:
function myStopCondition() {
console.log('leaving');
exit(0);
}
console.log('hello');
setTimeout(myStopCondition, 2000);
almost_forever.js
:
var forever = require('forever-monitor');
var child = new (forever.Monitor)('script.js', {
max: 10,
silent: false,
args: []
});
child.on('restart', function() {
console.error('Forever restarting script for ' + child.times + ' time');
});
child.on('exit:code', function(code) {
console.error('Forever detected script exited with code ' + code);
if (0 === code) child.stop(); // don't restart the script on exit(1)
});
child.start();
然后npm i forever-monitor [--save]
并以
node almost_forever.js