如何杀死nodejs中的子进程?


72

使用shelljs创建一个子进程

!/usr/bin/env node

require('/usr/local/lib/node_modules/shelljs/global');
   fs = require("fs");  
   var child=exec("sudo mongod &",{async:true,silent:true});

   function on_exit(){
        console.log('Process Exit');
        child.kill("SIGINT");
        process.exit(0)
    }

    process.on('SIGINT',on_exit);
    process.on('exit',on_exit);

子进程杀死父进程后仍在运行..


6
您正在运行mongod &,它将分叉该流程并将其发送到后台。发送SIGINT不会杀死实际mongod进程。
fardjad 2013年

1
还有一件事情,而不是执行,而是使用sudo mongodexecmongod和运行脚本sudo。如果需要,可以在执行后mongod(和process.setuid()process.setgid())删除特权。
fardjad

删除了'&'并且它起作用了....感谢stackoverflow.com/users/303270/fardjad
Deepak Patil

@fardjad,那么如何处理呢?我们都知道你在说什么。它写在这里,不是秘密的nodejs.org/api/…。但是要处理吗?你知道吗?
绿色的

@Green也许有帮助:npmjs.com/package/ps-tree
fardjad

Answers:


80

如果您可以使用node的内置child_process.spawn,则可以向SIGINT子进程发送信号:

var proc = require('child_process').spawn('mongod');
proc.kill('SIGINT');

这样做的好处是,主进程应该一直徘徊,直到所有子进程都终止。


3
proc.kill()还不够吗?还是我们需要proc.kill('SIGINT')?
亚历山大·米尔斯

我不记得具体的细节mongod,但是发送proc.kill()(当前)等价于发送proc.kill('SIGTERM')(我假设我相信SIGINT会关闭mongod?)。我想人们会为他们的特定应用选择正确的信号。
迈克尔·唐

31
这如何回答这个问题?这个答案暗示了问题的作者为终止该过程所做的一切。然而,它得到了很多赞成吗?
鱼骨

错误!您无法终止在子进程中启动的服务。您可以终止子进程,但不能终止服务。这就是问题`传递给子进程的信号可能实际上没有终止该进程。`nodejs.org/api/…
绿色,

1
谢谢,这节省了我的时间!另外,我有一个问题,就是我的分叉进程产生了另一个进程(带有集群),并且.kill('SIGINT')在我的electronic-nodejs应用程序中为我正确地关闭了每个子进程和子进程
Kirill Gusyatin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.