最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何真正杀死child

运维笔记admin12浏览0评论

如何真正杀死child

如何真正杀死child

我正在使用带有Nodejs的mocha来测试我的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);
    });
}

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

错误:听EADDRINUSE ::: 3300

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

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

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

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

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

有什么建议?谢谢

回答如下:

“exit”是一个事件,当节点在内部完成它的事件循环时触发,当你从外部终止进程时它不会被触发。

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

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

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论