2016-09-01 83 views
1

我在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程序執行。

主要問題:什麼時候應該殺死我的進程。

不怎麼樣,但是當。我不想應用超時,因爲我將在某個實例中運行該程序,並且可能有很多其他外部原因導致進程停滯不前,並且該進程可能有機會恢復。但是如果發生異常,過程將不會恢復。我想處理這些情況。 輸入流是空的,所以不知道錯誤是否發生。

+1

另請參閱[當Runtime.exec()不會](http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html)for許多關於正確創建和處理流程的好建議。然後忽略它是指'exec'並使用'ProcessBuilder'來創建進程。還要將'String arg'分解爲'String [] args'來解釋包含空格字符的路徑。 –

+0

@DannyChen它不回答我的問題。我有特定的SQL文件。因此,檢查該線程以查看活動可能沒有幫助。可能是進程正在等待數據庫連接,並可能在某個時間後恢復。所以基於時間來殺死一個進程並不是一個解決方案。我想確定這個過程是死鎖並不會進一步執行。 –

+0

這裏沒有證據表明存在僵局。不要濫用標準術語。 – EJP

回答

0

你的意思是卡住了嗎?通過像jconsole這樣的jvm監視工具觀察卡住的線程。如果你想停止基於一些異常和/或運行時錯誤操作系統過程中,你可以簡單地包裝你的代碼在catch塊

try { 
     //process initiation 
    } catch (Exception e) { 
     //attempt process stop 
    }catch(Error ex){ 
     //attempt process stop 
    } 

啓動操作系統的過程是高度依賴於系統的。如果你想試圖停止os進程,如果它比預期的要長,你可以在一個可以指定超時的線程中啓動進程。

+0

卡住意味着我使用'Runtime.exec()'執行一個文件,並且它什麼也不做。它由於某種原因被阻塞。原因對我來說是不可見的。沒有例外,但是這個過程被封鎖了,這是一個僵局。 –

+0

我更新了我的回覆。 –

+0

@HarshitaSethi塊不是死鎖。這是一塊。死鎖是有兩個進程和兩個鎖(或更多)的地方。這是一塊。不要濫用標準術語。 – EJP

相關問題