2015-05-05 55 views
1

我正在尋找一種方法來使用它們的pid來殺死Node.js進程。我一直在Google,StackOverflow和Node.js文檔中搜索幾個小時。這似乎應該存在。我只能找到基於我的變量newProc如何做到這一點,但我不能做newProc.kill(),因爲我想從功能範圍外殺死子進程。另外,我需要在MongoDB中保存一些用於保存記錄的內容,所以我認爲pid會更合適。如何使用pid殺死Node.js子進程?

var pid = newJob(); 
kill(pid); //<--anything like this? 

var newJob = function() { 
    var exec = require('child_process').exec, 
    var newProc = exec("some long running job", function (error, stdout, stderr) { 
    console.log("stdout: " + stdout); 
    console.log("stderr: " + stderr); 
    if (error) console.log('exec error: ' + error); 
    }); 
    return newProc.pid; 
} 

編輯:我可以在子進程上使用process.kill(pid)嗎? docs指出它是一個可以從任何地方訪問的全局對象。

最後,作爲一個小切線,有沒有辦法確保pid的永遠是唯一的?當然,我不想無意中殺死一個進程。

+0

爲什麼你不能'返回newProc',然後調用'newProc.kill( 'SIGHUP');'。你也可以像'exec('kill -9'+ newProc.pid,callback)那樣生成更多的linux;' – vanadium23

+0

我需要在MongoDB中存儲一些用於保存記錄的內容,所以我認爲pid會更合適。我應該簡單地將'newProc'存儲在MongoDB中,然後在後面調用newProc.kill('SIGHUP');'如果這不起作用,我會嘗試你的第二個建議。謝謝! – FullStack

回答

5

process.kill()完成這項工作。如您在編輯中所述,process是每個Node模塊中可用的全局對象。

請注意,只有在PID運行時,PID才能唯一標識您的子進程。退出後,PID可能已被重新用於不同的進程。如果你想確保你不會意外殺死另一個進程,你需要一些方法來檢查進程是否實際上是你所生成的進程。 (newProc.kill()基本上是圍繞process.kill(pid)的包裝,因此具有the same problem。)