我在unix服務器中使用Process
執行一些pl/sql文件。下面是代碼如何以編程方式知道Runtime.exec()進程何時卡住?
String line;
Process p = null;
p = Runtime.getRuntime().exec("sqlplus -s " + USER + "/" + PASS + "@" + sid + " @" + sqlTempDirectory);
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
if (line.contains("invalid username/password")) {
System.out.println(sql.getName() + " file creation skipped as invalid username/password");
p.destroy();
break;
}
}
input.close();
問題:這java.lang.Process
有時會擊中由於無效的用戶名/密碼,文件未找到或可能是某種未知的exception.Right現在,基於輸入流數據我趕上使用p.destroy().
的例外情況並銷燬該進程但是,這隻涵蓋了我所知的異常,並沒有發生任何其他異常。
問題:我怎麼知道這個過程是否被觸發?如果它被擊中,那麼我想破壞java.lang.Process
。
編輯檢查線程的活動可能不是解決方案,因爲我連接到數據庫。因此,該進程可能會等待數據庫連接並在設置連接時恢復,這可能需要時間。我在運行服務器實例中運行代碼,以便可以進行等待。這並不能證明這個過程已經死亡。我希望確定進程何時陷入僵局,並且在將來不會恢復。
編輯2:我不想殺死整個Java程序的執行。我只是想摧毀那個特定的java.lang.Process
。所以解決方案必須是一些java代碼,它會破壞java.lang.Process
並繼續執行其餘的程序。
編輯3:問題不重複,因爲我需要一種Java方式。獲得線程轉儲將無濟於事。我只想銷燬java.lang.Process
,而不是完整的java程序執行。
主要問題:什麼時候應該殺死我的進程。
不怎麼樣,但是當。我不想應用超時,因爲我將在某個實例中運行該程序,並且可能有很多其他外部原因導致進程停滯不前,並且該進程可能有機會恢復。但是如果發生異常,過程將不會恢復。我想處理這些情況。 輸入流是空的,所以不知道錯誤是否發生。
另請參閱[當Runtime.exec()不會](http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html)for許多關於正確創建和處理流程的好建議。然後忽略它是指'exec'並使用'ProcessBuilder'來創建進程。還要將'String arg'分解爲'String [] args'來解釋包含空格字符的路徑。 –
@DannyChen它不回答我的問題。我有特定的SQL文件。因此,檢查該線程以查看活動可能沒有幫助。可能是進程正在等待數據庫連接,並可能在某個時間後恢復。所以基於時間來殺死一個進程並不是一個解決方案。我想確定這個過程是死鎖並不會進一步執行。 –
這裏沒有證據表明存在僵局。不要濫用標準術語。 – EJP