2009-08-25 91 views
3

我有一個運行一些其他程序的Java程序。一旦用戶完成他們有一個按鈕來殺死所有進程,這應該殺死所有正在運行的,但它應該通過強制它們來執行。這些其他進程中至少有一個也是用Java編寫的,並且有多個關閉鉤子,因爲它會在退出時自動保存首選項文件並殺死它自己啓動的進程,例如。如何在不強制Java的情況下終止Java進程?

Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
     if (process != null) 
      process.destroy(); 
     } 
    } 

當主進程調用銷燬上述代碼不在子進程上運行。無論如何,我可以終止進程,所以這仍然會運行?我從Perl移植它會殺死(9,@ kill_process);

謝謝。

+0

從關於destroy的文檔:*「殺死子進程,由這個Process對象表示的子進程被強制終止。」* – Tim

+0

我知道這是問題所在,我不希望它們被強行終止。 –

+0

然後,您需要執行一些IPC,以便子進程將優雅地終止。 –

回答

6

殺死信號9(SIGKILL)告訴操作系統殺死進程。這個過程沒有事先通知這種情況將會發生,因此無法進行任何清理。 process.destroy()相當於Perl的kill(9,@kill_process);,舊的進程也不會進行任何清理。

殺死信號15(SIGTERM)會告訴一個進程自殺。

+0

我只是再看一遍,他們被強迫,但其中一個並不會檢測到其他人的時候,並優雅地完成所有清理。 感謝您讓我走向正確的方向。我從幾年前編寫的這個Perl,現在沒有人知道它是如何工作的。 –

2

有幾種方式與應用程序進行通信。其中最常見的是發送信號。信號命令稱爲kill。你發佈的Perl代碼使用這個問題。

您可以發送各種信號,其中一些是由應用程序處理,其中一些由os處理。 默認信號是HUP。它告訴應用程序「連接到用戶」被終止(它實際上意味着調制解調器被絞死)並且它應該退出。行爲恰當的應用程序將退出。

如果您發送信號9(這是您的Perl代碼所做的),OS將毫無疑問地終止應用程序。

另一種方法是使用其默認方式與應用程序進行通信。因此,您可以將「Ctrl + c」或「Alt + f4」(通常爲最終應用程序的命令)發送到進程的STDIN。

相關問題