[英]how to kill command line process start with 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上執行某些操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.