簡體   English   中英

如何真正殺死child_process nodejs

[英]How to REALLY kill a child_process nodejs

我正在使用帶有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在我的process.on('exit')監聽sudo pkill node上運行sudo pkill node ,但這看起來不是一件好事。

Mac和Ubuntu都會發生這種情況。

有什么建議? 謝謝

“exit”是一個事件,當節點在內部完成它的事件循環時觸發,當你從外部終止進程時它不會被觸發。

您正在尋找的是在SIGINT上執行某些操作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM