2013-08-07 114 views
0

這是我的工作流程:java程序/ IO執行航

我從數據庫獲取作業​​,我跑了幾個任務,我運行一個外部程序,讀取一個文件,併產生另一個(這通常在10秒需要)。以下是代碼:

Process p = Runtime.getRuntime().exec(prog, null, new File(path)); 

BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 

String s; 
String errorString = ""; 
while((s = stdInput.readLine()) != null) { 
    if(s.toLowerCase().contains("error")) { 
     Log.writeLog("error: " + s); 
     errorString += s + "\r\n"; 
    } 
} 

if(errorString.length() > 1) { 
    Emailer.email(name + "*" + errorString, "ERROR"); 
} 

while((s = stdError.readLine()) != null) { 
    Log.writeLog("ERROR: " + s); 
} 

但是,該代碼段被絞死。我通過LogMeIn控制運行代碼的服務器,一旦我登錄,進程暢通無阻(總運行時間大約爲280秒)並繼續。該過程沒有產生ERROR結果。這種情況不時發生的情況比我們想要的更頻繁。我們在程序中做了很多小型的IO操作,並且硬盤不時地變得非常充滿。

任何想法可能發生什麼?

謝謝!

編輯:服務器是連接到LogMeIn只是一個普通的計算機。我擔心的是,由於它是普通的計算機,它可能會在不使用時關閉CPU /硬盤驅動器(不確定正確的術語)。這有點解釋了爲什麼一旦我登錄到LogMeIn並可以訪問計算機,它將繼續運行。

編輯2:直接跟着這個過程,我運行這個。而且這也持續了一段荒謬的時間(通常是5秒,花費了200多秒)。讓我覺得硬盤決定睡午覺?

private void cleanup(String path) { 

    File srcPath = new File(path); 
    File[] files = srcPath.listFiles(); 

    if(files != null) { 
     for(File file : files) { 
      if(file.isDirectory()) { 
       cleanup(file.getAbsolutePath()); 
      } else { 
       if(file.getAbsolutePath().endsWith(".original")) { 
        String fileName = file.getAbsolutePath().substring(0,  file.getAbsolutePath().lastIndexOf(".original")); 
        IO.delete(fileName); 
        if(!IO.renameFile(file.getAbsolutePath(), new File(fileName).getAbsolutePath())) { 
         Log.writeLogSevere("Failed to rename file, this could be a problem..." + fileName); 
        } else { 
         Log.writeLog("Cleaned up: " + fileName); 
        } 
       } 
      } 
     } 
    } 
} 
+0

日誌文件中沒有任何內容? –

+0

@GrahamGriffiths沒有日誌,也沒有電子郵件。 – jn1kk

+0

我猜你所調用的進程會掛起 - 你能檢查它是否仍在運行?這可能是數據庫超時? –

回答

0

最有可能的是,運行p線程並沒有死,p.getInputStream()不爲空,和而不是它的數據。

掛起時,我會檢查當前正在運行的進程(Unix上的ps命令)或Windows上的任務管理器。這會告訴你p是否完成。如果不是,那麼無論程序是什麼,都會有問題,並且會阻礙您的其他代碼。

0

您不排空錯誤流。你最後這樣做,通常可能爲時已晚。該進程的輸出緩衝區已滿並且進程阻止在stderr輸出緩衝區中等待獲取更多空間。

您必須爲此使用單獨的線程,或者(使用ProcessBuilder更簡單)redirectErrorStream

+0

當我通過LogMeIn控制服務器時,該過程最終完成。沒有任何東西寫入日誌,似乎表明ErrorStream是空的。我會把這個。 – jn1kk