2017-04-25 78 views
1

我必須在Nodejs上使用exec方法,因爲我需要執行一些stdout重定向並同時運行多個命令。於是我運行子進程是這樣​​的:我該如何殺死Windows上由exec運行的子進程?

let shell = null; 
const child_process = require('child_process') 
var command = 'activate python_environment & bokeh serve project_folder/ log/logger.log 2>&1'; 
shell = child_process.exec(command); 

我需要ps-tree我在belower代碼做殺死這些孩子。它在Ubuntu上運行良好。但問題是如果我不殺死子進程,我會在Windows上得到一個孤兒(殭屍)進程。

const psTree = require('ps-tree') 
app.on('window-all-closed', function() { 
    electron.app.quit() 
    if(shell != null){ 
     psTree(shell.pid, function (err, children) { 
      children.map(function (p) { 
       process.kill(p.PID);      
      }); 
     }); 
    } 
}); 

ps-tree模塊使用Linux和Windows上的命令wmic命令ps。所以它是跨平臺的。但這對我來說不起作用。有一個更好的方法嗎?

我在探索ps-tree源代碼,但是我什麼也沒找到。

我使用process.kill,因爲我也使用electron

我恐怕我應該嘗試手動獲取所有進程列表wmic。這就是ps-tree正在嘗試做的事情。

注意:模塊tree-kill在兩個平臺上都不起作用。

更新

好吧,我發現了一個醜陋的解決方法。我通過python代碼os.getpid()將我的python進程PID保存到外部文件中。因爲這是你有麻煩的一個

const fs = require('fs'); 
fs.readFile(filePath, 'utf-8', function (err, data) { 
    process.kill(parseInt(data, 10)); 
    app.quit();     
}); 
+0

看起來很危險 - 進程ID被重用,所以你可以殺死偶然的進程,碰巧有一個父進程ID與你的shell相同。處理流程樹最穩健的方法是使用作業對象。如果'節點。js'不支持,你可以編寫一個C程序來代表你運行子命令。 –

+0

「工作對象」是什麼意思?我想要做的是殺死shell進程及其子進程,我想殺死完整的樹。之後,其他進程可以重用進程ID – ChesuCR

+0

您可以使用作業對象來跟蹤進程樹,也可以使用它來殺死所有進程。 [看到這裏。](http://stackoverflow.com/search?q=JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE)不幸的是,這並不簡單。使用'ps-tree'的風險是shell進程的進程ID可能以前屬於其他進程。你會殺死進程中的所有子進程以及進程樹中的子進程。我想如果你能通過除了父PID以外的其他特徵來識別它們,你可以相應地過濾結果。 –

回答

1

我回答的Windows:有了這個,我可以節點中訪問到有問題的PID這樣。

看着你執行的命令,在我看來,你的兩個命令的連接可能是罪魁禍首,所以我會試着沒有它。

如果你不能使用wmic是我知道的最好的方法,那麼你第一次必須手動檢查yes。一旦你有選擇標準,你可以自動關閉所有東西。 當進程忙時運行命令wmic process>processes.txt 之後,使用編輯器檢查文件processes.txt,並在列commandline中查找所有要殺死的進程的公共字符串。 這將是您的選擇標準。 由於創建過程的整個命令行都存在路徑和參數,因此這應該不成問題。

之後,你應該能夠關閉所有這些過程用命令

wmic process Where "CommandLine Like '%my_select_criterium%'" Call Terminate 

我在Ruby腳本調用一個壞運行得Java應用程序,我沒有控制研究過使用這種技術。

+0

這不能解決OP的特定問題嗎?這隻提供了用於使用wmic命令(其中'ps-tree'已經完成)的API –

+0

@AP,因爲ps-tree沒有像假設那樣工作我回答他的問題有沒有更好的方法來做到這一點? – peter

+1

你至少可以嘗試將這個包裝成節點特定的答案,通過顯示你如何使用[***'spawnSync()'***](https://nodejs.org/api/child_process.html #child_process_child_process_spawnsync_command_args_options)或[***'execSync()***](https://nodejs.org/api/child_process.html#child_process_child_process_execsync_command_options)。所以它作爲答案是相關的。 –