2012-09-16 84 views
8

我正在Windows中運行一個從Windows事件中收集日誌的java程序。將創建一個.csv文件,用於執行某些操作。Java:等待exec進程直到它退出

命令被執行並傳送。我怎樣才能讓我的Java程序等待進程完成?

這裏是我使用的代碼片段:

Runtime commandPrompt = Runtime.getRuntime(); 
try {   
    Process powershell = commandPrompt.exec("powershell -Command \"get-winevent -FilterHashTable @{ logname = 'Microsoft-Windows-PrintService/Operational';StartTime = '"+givenDate+" 12:00:01 AM'; EndTime = '"+beforeDay+" 23:59:59 '; ID = 307 ;} | ConvertTo-csv| Out-file "+ file +"\""); 
//I have tried waitFor() here but that does not seem to work, required command is executed but is still blocked 
} catch (IOException e) { } 
// Remaining code should get executed only after above is completed. 
+1

另外,您可以考慮使用共享-EXEC:http://commons.apache.org/exec/tutorial .html –

回答

12

您需要使用waitFor(),而不是wait()。這樣,你的線程將被阻塞,直到執行的命令完成。

+0

不,這不是我上面提到的解決方案,waitfor()不起作用的評論。如果它的工作,那麼將沒有問題 – user1631171

1

這應該起作用。如果不是,請指定究竟不起作用

Runtime commandPrompt = Runtime.getRuntime(); 
try {   
    Process powershell = commandPrompt.exec("powershell -Command \"get-winevent -FilterHashTable @{ logname = 'Microsoft-Windows-PrintService/Operational';StartTime = '"+givenDate+" 12:00:01 AM'; EndTime = '"+beforeDay+" 23:59:59 '; ID = 307 ;} | ConvertTo-csv| Out-file "+ file +"\""); 
    powershell.waitFor(); 
} catch (IOException e) { } 
// remaining code 
+0

其實我已經試過這個。 CSV文件將作爲命令的輸出給出,但其餘代碼在創建CSV之前開始執行。我相信這可能是因爲命令中使用了管道。 – user1631171

+0

這是一種競爭條件。您不能依賴緩衝的緩存文件系統上的文件創建。如果您的下一個代碼依賴於此文件,則可以將其保存在內存中,也可以輪詢文件系統。 (Linux有select/epoll) – tuergeist

+0

是的,如果創建文件,我通過輪詢進行了臨時修復。是的,當文件被創建時存在競爭條件。 – user1631171

4

我在這裏找到了答案Run shell script from Java Synchronously

public static void executeScript(String script) { 
    try { 
     ProcessBuilder pb = new ProcessBuilder(script); 
     Process p = pb.start(); // Start the process. 
     p.waitFor(); // Wait for the process to finish. 
     System.out.println("Script executed successfully"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
}