如何真正杀死child_process nodejs

时间:2017-04-25 14:25:57

标签: node.js child-process

我使用mocha和Nodejs来测试我的restApi。 当我运行mocha时,我告诉我的测试创建一个child_process并运行API,以便我可以向它发出请求。

问题是当测试退出(完成或崩溃)时,似乎API一直在后台运行。我在这里看到了一些答案,指示在主进程退出时手动终止子进程。所以我这样做了:

export function startProcess(done) {
    const child = spawn('babel-node', ["app.js"]);

    child.stdout.on("data", function(data) {
        data = data.toString();
        // console.log(data.toString());

        if(data.indexOf("Server online") > -1) done();
    });

    child.stderr.on('data', function(err) {
        console.log("ERROR: ", err.toString());
    });

    child.on('exit', function(code) {
        console.log("PROPERLY EXITING");
        console.log("Child process exited with code", code);
    });

    process.on('exit', function(code) {
        console.log("Killing child process");
        child.kill();
        console.log("Main process exited with code", code);
    });
}

当主进程退出时,它会记录"杀死子进程",这意味着确实调用了child.kill()。但是如果我再次尝试运行我的测试,当调用spawn命令时,API会抛出错误

  

错误:听EADDRINUSE ::: 3300

,意味着API仍在运行,并且已采用该端口地址。

所以我必须运行sudo pkill node来真正杀死所有节点进程,然后npm test再次运行。

我错过了什么吗?这真的是实现我期待的方式吗?

我考虑过使用child_process.exec在我的sudo pkill node听众上运行process.on('exit'),但这似乎不是一件好事。

Mac和Ubuntu都会发生这种情况。

有什么建议吗? 感谢

1 个答案:

答案 0 :(得分:1)

“退出”是一个事件,该事件在节点内部完成其事件循环时触发,而在您外部终止该过程时不会触发。

您正在寻找的是在SIGINT上执行某些操作。

看看http://nodejs.org/api/process.html#process_signal_events