[英]Terminate process run with `exec` when program terminates
我有一個java程序,它運行另一個(Python)程序作為進程。
Process p = Runtime.getRuntime().exec("program.py", envp);
如果java程序完成處理,Python進程也會完成。 finish
命令向Python進程發送一個信號以關閉它。
在正常情況下,該過程以這種方式關閉:
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
output.write("@EOF\n");
output.flush();
但是,當java程序崩潰時,進程不會關閉。 由於崩潰,不發送關閉命令。 是否可以在程序終止時自動終止進程?
嘿@czuk會對ShutdownHook掛鈎有什么用嗎? 這將處理以下方案
Java虛擬機關閉以響應兩種事件:
當最后一個非守護程序線程退出或調用退出(等效,System.exit)方法時,程序正常退出,或者
響應於用戶中斷(例如,鍵入^ C)或系統范圍的事件(例如用戶注銷或系統關閉),終止虛擬機。
當系統意外崩潰時,這並不容易捕獲。
假設崩潰意味着Java程序拋出異常,我會在發生這種情況時終止Python進程。 我還沒有看到你的代碼,但是:
class Foo {
Process p;
private void doStuff() throws Exception {
p = Runtime.getRuntime().exec("program.py", envp);
// More code ...
}
private void startStuff() {
try {
doStuff();
} catch (Exception e) {
p.destroy();
}
}
public static void main(String[] args) {
Foo foo = new Foo();
foo.startStuff();
}
}
如果只有導致程序崩潰的異常從doStuff()
逃脫,那么這樣的東西應該有效。
即使您不希望程序在完成時以這種方式崩潰,我認為這種方法比將它包裝在shell腳本中更好,因為shell腳本在某種程度上會破壞Python進程。 在程序中處理它不那么復雜,一旦程序完成后保留代碼甚至可能是個好主意,因為你可能仍然有你不知道的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.