我創建了一個Ant任務來編譯VB6應用程序。如果腳本被取消,如何終止從Ant任務啓動的進程?
源文件的一些預處理後,我用
Process p = Runtime.getRuntime().exec(...);
p.waitFor();
開始VB6.exe
適當的參數但是,當我按Ctrl + C,而螞蟻正在運行,腳本,我的任務是終止,但衍生的進程仍在運行。
如何在Ant腳本終止時自動終止我開始的過程? 如果我按Ctrl + C究竟發生了什麼?我的任務是否立即死亡或有什麼反應?
我創建了一個Ant任務來編譯VB6應用程序。如果腳本被取消,如何終止從Ant任務啓動的進程?
源文件的一些預處理後,我用
Process p = Runtime.getRuntime().exec(...);
p.waitFor();
開始VB6.exe
適當的參數但是,當我按Ctrl + C,而螞蟻正在運行,腳本,我的任務是終止,但衍生的進程仍在運行。
如何在Ant腳本終止時自動終止我開始的過程? 如果我按Ctrl + C究竟發生了什麼?我的任務是否立即死亡或有什麼反應?
你可能有興趣在此代碼:
final Process process = new ProcessBuilder("blah blah").start();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
process.destroy();
}
});
process.waitFor();
的javadoc addShutdownHook:
Java虛擬機在響應關閉以兩種事件:
- 程序正常退出時,最後一個非守護進程線程退出或退出調用(相當於System.exit)方法或響應用戶中斷(例如鍵入^ C,
)或系統範圍事件(如用戶註銷或系統關閉)來終止虛擬機。
Runtime.exec()
在單獨的OS進程中運行該命令。當你按下Ctrl + C時,你會終止Java進程。
您可以嘗試Runtime.addShutdownHook(Thread hook)
。當你按下Ctrl + C鍵時,這個鉤子線程將在JVM關閉時被調用。實現將試圖殺死你開始的進程的鉤子線程。要終止進程,您需要在該操作系統上找到該命令,並在Runtime.exec()
中使用該命令。
使用Runtime.exec()與kill或其他操作系統相關的命令是醜陋的; Process#destroy()更好 – dfa 2009-04-17 09:13:52