当前位置: 首页 > 面试题库 >

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

戴品
2023-03-14
问题内容

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

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

如果您将间隔时间保持足够长,它将使间隔运行,而不会引起过多干扰。

有更好的方法吗?

问题的长版

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

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

我的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 { };
    }
}

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

有什么办法比我做得更好吗?即, 无需 使用这种“ hack”就可以保持进程运行?


问题答案:

尽管看起来这个问题没有正确的答案,但到目前为止,我们有3种可能的破解方法,老实说,我认为我的方法是侵入性较小的方法:

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

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

最初,我的破解Number.POSITIVE_INFINITY是在周期内过去的,因此计时器实际上永远不会触发,但是这种行为最近已更改,现在API不接受大于2147483647(即2 ** 31 - 1)的值。在此处和此处查看文档。

作为参考,下面是到目前为止给出的其他两个答案:

乔的:

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

将创建一个“伪侦听器”,正如他所说的那样。一个较小的缺点是,我们仅为此分配了一个端口。

雅各的:

process.stdin.resume();

或等效的:

process.stdin.on("data", () => {});

stdin成“旧”模式,弃用的功能,仍然存在于Node.js的用于与Node.js的v0.10(之前编写的脚本兼容性参考)。



 类似资料:
  • 我有一个应用Gradle插件的项目。我的问题是,即使底层进程终止,它也不会终止:如果我运行这个: 带有仅包含系统的主系统。退出(0) 程序终止,但Gradle没有终止。当底层Java程序终止时,如何强制Gradle进程终止? 编辑:我知道我可以调用gradle——stop,但这需要另一个进程,这不是一个选项。

  • 我使用的是p=运行时。getRuntime()。exec(“myScript.sh”);作为按钮a的addActionListener(new ActionListener())的actionPerformed(ActionEvent evt)的一部分。 我想有一个方法来终止进程。我试图创建另一个按钮(按钮B)来调用p.destroy()。但是,看起来在单击按钮A后,它启动了进程,并且只有在进程完

  • 问题内容: 由于许多node.js脚本遵循异步执行模式(以下示例),因此它们如何知道何时停止? 在以下代码中,节点如何确定在处理writeFile和适当注册回调之后,在回调运行之前,该进程应保持活动状态? 问题答案: 节点跟踪所有未完成的工作请求。您的fs.writefile()调用为I / O创建工作请求,并将您的回调添加到该请求。节点在启动I / O活动的同时将工作请求保存到其表中。到达函数末

  • 问题内容: 我正在尝试在python中编写一些短脚本,如果尚未启动该脚本,则会在子进程中启动另一个python代码,否则终止终端机和应用程序(Linux)。 所以看起来像: 应用缺少从文件 “ .proc”中 读取的pid来命名进程的知识,存在问题。另一个问题是解释器说名为 dat的 字符串不等于 “ x” ?我错过了什么? 问题答案: 使用很棒的库非常简单: 如果您不想安装新的库,可以使用以下模

  • 我试图用< code>exec()调用PHP CLI脚本中的一个长期运行的shell命令。但是我无论如何也想不出如何中断PHP脚本并杀死产生的子进程。好像我一调用< code>exec(),我的信号处理程序就被忽略了。下面的代码像我预期的那样工作;如果我向进程发送SIGTERM,它会回显< code>SIGTERM并立即退出。 但是,如果我替换< code > sleep(60);与< code

  • 我使用更改昵称做了一个挂机命令。每当机器人角色之上的用户使用此命令时。我得到以下错误(节点:169) 这将在稍后终止bots进程。这将进一步终止bots进程。是否有任何方法可以在不增加bot角色的情况下停止终止节点进程。这是我的命令代码 你能帮我吗?