簡體   English   中英

Java ProcessBuilder process.destroy()不會在winXP中殺死子進程

[英]Java ProcessBuilder process.destroy() not killing child processes in winXP

我有一個java應用程序,它使用ProcessBuilder來准備操作系統命令並給我一個Process對象。 (實際的os命令是使用cygwin通過ssh進行rsync)。

這在Windows中運行良好,但是如果我想使用process.destroy()停止進程,它不會殺死子ssh和rsync進程.....我必須使用windows任務管理器手動終止它們。

是否有可能獲取進程的OutputStream並在調用destroy();之前以某種方式發送ctrl-c destroy();

如果有人對解決方法有任何想法,那就太好了。 感謝:D

我也認為模擬Ctrl-C以完全殺死ssh是有問題的。

我會做什么,是以下方法之一。 要么使用Windows命令來找出誰是ssh的兒子(這有點問題,因為你需要知道你當前的pid才能收到你自己的子進程)。 我相信sysinternals的pstools是一個很好的命令行工具,可以讓你跟蹤孤兒進程。 請參閱此示例 ,以使用taskList.exe (可以以CSV格式BTW輸出其輸出)或執行特殊VBScript來控制Windows進程。

第二種方法是使用諸如winp之類的java庫來執行和控制ssh進程。 我相信如果發送正確的信息是不夠的,你可以列出所有的孩子並強行殺死他們。 這將是我的首選方法。 請注意, killRecursively方法完全符合您的要求。

請注意,這些方法不應僅呈現您的應用程序窗口。 您可以將這些封裝在一個在Windows和Linux機器上運行方式不同的類中。

請注意我沒有嘗試對Windows進程進行細粒度控制,因此我不確定我找到的解決方案有多成熟。

我不確定Process.destroy()在幕后做什么(發送信號或類似信號?)。

你可能會發現更好的方法是在shell腳本中調用你的ssh / rsync,並在stdout上返回一個進程id,然后當你想殺死進程時,用該進程id執行/bin/kill 有點凌亂,但也許更可靠。

注意你可以使用SIGTERM /bin/kill ,如果它特別頑固,可以使用SIGKILL。

暫無
暫無

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

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