簡體   English   中英

終止由* nix上的ProcessBuilder生成的子進程

[英]Terminate child processes spawned by a ProcessBuilder on *nix

我正在從java程序執行一個shell管道 - 它就像是

ProcessBuilder builder = new ProcessBuilder(
                         "sh", "-c", "program1 | program2 | program3");
builder.start();

在某些情況下,可能需要終止此單元。 然而

process.destroy();

只會破壞“sh”命令。 pipline中的命令將被孤立並由init進程采用。

有沒有辦法輕松終止所有這些子進程 - 或者以更容易終止它們的方式執行上述管道。 改變程序1/2/3無法完成。 Linux之外的可移植性不是問題。

我有兩種方法可以做到這一點:

  1. 你可以運行一個pkill program1 program2 program3

  2. 您可以編寫一個啟動整個bash命令行的中間程序,這個中間程序會安裝一個信號處理程序,當它獲得STOP信號時會殺死它自己的子進程。

而不是在shell中運行管道,在java中構建管道。

然后,您將需要三個進程構建器(一個用於program1,一個用於program2,一個用於program3:D),還有一些線程將每個進程的輸出流的輸出傳輸到下一個進程的輸入流。

這樣你就可以為每個子節點獲取jlProcess實例,並且可以在那些節點上調用destroy()

在C中創建一個包裝程序,它(a)啟動管道的其余部分,(b)通過在調用exit(2)本身之前終止管道中的所有參與者來處理一些信號。

暫無
暫無

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

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