簡體   English   中英

程序終止時,用`exec`終止進程運行

[英]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)或系統范圍的事件(例如用戶注銷或系統關閉),終止虛擬機。

當系統意外崩潰時,這並不容易捕獲。

也許使用Thread.setDefaultUncaughtExceptionHandler方法?

假設崩潰意味着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.

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