如何强制阻止Node.js进程终止?

时间:2014-05-13 02:50:30

标签: node.js edge.js

TL; DR

强制保持Node.js进程运行的最佳方法是什么,即保持其事件循环不运行,从而阻止进程终止?我能想出的最佳解决方案是:

const SOME_HUGE_INTERVAL = 1 << 30;
setInterval(() => {}, SOME_HUGE_INTERVAL);

如果你将间隔时间保持足够长的时间,这将使间隔保持运行而不会造成太大的干扰。

有更好的方法吗?

问题的长版

我有一个使用Edge.js的Node.js脚本来注册回调函数,以便可以在.NET中从DLL内部调用它。此功能将被调用为每秒1次,发送一个应该打印到控制台的简单序列号。

Edge.js部分很好,一切正常。我唯一的问题是我的Node.js进程执行它的脚本,然后它用完了要处理的事件。它的事件循环为空,它只是终止,忽略了它应该继续运行以便能够从DLL接收回调的事实。

My Node.js脚本:

var
    edge = require('edge');

var foo = edge.func({
    assemblyFile: 'cs.dll',
    typeName: 'cs.MyClass',
    methodName: 'Foo'
});

// The callback function that will be called from C# code:
function callback(sequence) {
    console.info('Sequence:', sequence);
}

// Register for a callback:
foo({ callback: callback }, true);

// My hack to keep the process alive:
setInterval(function() {}, 60000);

我的C#代码(DLL):

public class MyClass
{
    Func<object, Task<object>> Callback;

    void Bar()
    {
        int sequence = 1;

        while (true)
        {
            Callback(sequence++);
            Thread.Sleep(1000);
        }
    }

    public async Task<object> Foo(dynamic input)
    {
        // Receives the callback function that will be used:
        Callback = (Func<object, Task<object>>)input.callback;

        // Starts a new thread that will call back periodically:
        (new Thread(Bar)).Start();

        return new object { };
    }
}

我能想到的唯一解决方案是注册一个具有长间隔的计时器来调用空函数,以保持调度程序繁忙并避免使事件循环变空,以便进程永远运行。

有没有办法比我更好地做到这一点?即,保持流程不用必须使用这种&#34; hack&#34;?

4 个答案:

答案 0 :(得分:29)

使用"old" Streams mode来监听永远不会出现的标准输入:

// Start reading from stdin so we don't exit.
process.stdin.resume();

答案 1 :(得分:18)

虽然看起来这个问题没有正确的答案,但到目前为止我们有3个可能的黑客攻击,老实说我认为我的方法不那么具有侵入性:

:POST /db/data/cypher {
    "query": "MATCH p=(n:SOL { PRB : {PRB}})-[r]-(m:SOL { PRB : {PRB2} }) RETURN DISTINCT nodes(p) AS Experiences, reduce(CONS = (1), r in relationships(p) | CONS * r.points) AS Impact ",
    "params": {
        "PRB": "Beginning",
        "PRB2": "End"
    }
}

这将设置一个大约每12天发射一次的间隔。

  

最初,我的黑客通过setInterval(() => {}, 1 << 30); 作为句点,所以计时器实际上永远不会触发,但这种行为最近发生了变化,现在API并不接受大于2147483647的任何内容(即,Number.POSITIVE_INFINITY)。请参阅文档herehere

作为参考,以下是目前给出的另外两个答案:

乔&#39; S:

2 ** 31 - 1

他会称之为创建一个&#34;虚假的倾听者&#34;一个小缺点是我们只为此分配一个端口。

雅各布&#39; S:

require('net').createServer().listen();

或同等的:

process.stdin.resume();

process.stdin.on("data", () => {}); 放入&#34; old&#34; mode,一个不推荐使用的功能,仍然存在于Node.js中,以便与Node.js v0.10(reference)之前编写的脚本兼容。

答案 2 :(得分:0)

我将加入另一个技巧。使用Promise

的方法如下
new Promise(_ => null)

将其扔到.js文件的底部,它将永远运行。

答案 3 :(得分:0)

您可以使用 setTimeout(function() {""},1000000000000000000); 命令使脚本保持活动状态而不会过载。