在某些情况下,我可以永远阻止重新启动节点脚本吗?

时间:2015-03-13 12:17:20

标签: node.js forever

我有一个节点脚本,我从命令行永远运行:forever index.js

当该脚本崩溃时,我希望永远重启它,但不是所有时间。在某些情况下,我知道需要人工干预来修复。在这些情况下,我希望能够以永远不会重新启动它的方式退出流程。

有没有办法做到这一点?

我原本以为我可以使用process.exit(1)重新启动流程,但不会使用process.exit(0)重新启动,但显然情况并非如此。

这是另一种说法:

  • 在下面的代码中填写空格。
  • 将结果另存为 index.js
  • 使用forever index.js
  • 启动脚本
  • 脚本应打印“hello”,退出,不要重新启动

    setTimeout(function () {
        console.log("hello")
       // YOUR CODE GOES HERE
    }, 1500)
    

顺便说一句,那里的延迟只是默认的工作--minUpTime为1秒

2 个答案:

答案 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

来运行script.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