2013-07-05 33 views
1

我正在處理需要多次在MAC OS中運行shell文件的項目。 shell文件將每次運行的結果寫入單獨的日誌文件。爲了加速這個過程,我必須使用我們機器中所有可用的內核。我試圖用Java中的BuildProcess來完成這個任務。它可以在幾秒鐘內正常工作,但幾秒後停止。在單核機器上運行每個進程大約需要18個小時。例如,如果運行以下操作,它將啓動兩個進程,並使它們保持約10秒的運行時間,但之後它們將被殺死並且沒有錯誤!Java中的多處理使用ProcessBuilder

ProcessBuilder pb1 = new ProcessBuilder("/bin/bash", "runFS.sh") 
Process p1 = pb1.start() 

ProcessBuilder pb2 = new ProcessBuilder("/bin/bash", "runFS.sh") 
Process p2 = pb2.start(); 

任何幫助將不勝感激。

+0

您是否確定該腳本不需要用戶輸入?那麼日誌文件呢?他們說什麼?你可以控制stdout/stderr並將它們重定向到你想要的地方嗎? – fge

+1

請注意,由ProcessBuilder創建的進程的stdin,stdout和stdErr未連接到控制檯。如果你想看到這些進程的輸出(即它們的錯誤消息),你將不得不使用Process#getErrorStream/getInputStream。 – Aurand

+0

程序的輸出保存在日誌文件中。這已在runFS.sh中處理。我只是簡單地想要在不同的CPU內核上使用不同參數運行此文件。 – Arash

回答

0

如果您的示例代碼是任何需要解決的問題,則缺少p1.waitFor()p2.waitFor()以在子進程正在運行時實際保留主進程。所以,當你的JVM關閉時,它也會殺死你開始的進程。

+0

我嘗試使用waitFor(),但它不會使幾個進程同時運行多個runFS.sh實例。它依次運行每個實例。 – Arash

+0

當子流程仍在運行時,還有其他方法可以使主進程保持活動狀態嗎? – Arash

+0

保持主體活着的一條途徑是要求用戶輸入。就像使用'int tmp = new Scanner(System.in).nextInt();'但我需要更多的結構化方式來做到這一點。 – Arash