【问题标题】:Kill a node.js program without killing child processes杀死 node.js 程序而不杀死子进程
【发布时间】:2015-05-19 18:33:12
【问题描述】:

我有一个启动多个子进程的 node.js 程序。如果节点崩溃但让它们继续运行,我希望能够测试这些子进程会发生什么。我尝试了以下方法:

process.on('SIGUSR1', function(){   process.exit(0);    });

这在我的测试设置中效果很好,当我运行以下命令时,子进程保持正常运行并且节点实例关闭:

killall -10 node

但是,在我的生产部署中令我惊讶的是,它未能让子进程启动。我感兴趣的主要子进程是 chromium-browser 的一个实例。不同之处似乎在于该过程的启动方式。在我的测试设置中,我直接调用节点,但在我的生产设置中,我调用了一个执行调用的脚本。

我想在上面的匿名回调函数中找到一种方法,它可以处理 SIGUSR1 信号,告诉节点在杀死自己时不要关闭其子进程。我知道我可以分离我创建的流程,但我宁愿做一些涉及较少的事情(尽管不可否认,这并不太涉及)。

我在 Ubuntu 12.04 上运行节点 0.8.21。

感谢您提出的任何想法。

【问题讨论】:

    标签: javascript linux node.js process


    【解决方案1】:

    我继续尝试看看仅仅创建分离的进程会给我带来多少悲伤,是否仍然允许我使用信号回调等,一切似乎都很好。所以我打算这样实现它。

    这是我的原始代码:

    self.oUIProcessHandle = spawn('chromium-browser', 
        ['http://127.0.0.1:8091/index.html', '-kiosk', '-incognito', '-start-maximized']);
    

    我把它改成了以下:

    self.oUIProcessHandle = spawn('chromium-browser', 
        ['http://127.0.0.1:8091/index.html', '-kiosk', '-incognito', '-start-maximized'],
        {detached: true, stdio: ['ignore', 'ignore', 'ignore']});
    

    现在,当我从我的代码中调用 process.exit(0) 时,它会使我的浏览器启动并运行。

    【讨论】:

    • 完美解决方案.. +1