2013-10-07 200 views
1

首先,我是一名編程初學者,因此對於我的問題缺乏專業準確的術語表示歉意,但希望我能設法解決我的觀點。如何運行本身啓動兩個後臺進程的後臺shell腳本?

你有什麼建議如何在bash或tcsh我可以運行一個長的後臺進程,它本身啓動一些程序,並且必須在不同的核心上並行運行三個長進程並等待所有三個進程完成才能繼續。 ..?

我已經寫了一個shell腳本(用於bash)來將圖像過濾器應用到短而重的視頻剪輯的每一幀(實際上這是一個科學的X線斷層圖,但這並不重要)。它應該是:

  1. 用腳本創建一個文件,使用em2em軟件將整個文件轉換爲不同的格式。

  2. 將轉換後的文件拆分爲三個相等部分,並使用程序蜘蛛在單獨的進程中將每組幀分別過濾到我的Linux服務器上的不同核心上(以加快速度)。首先,三批處理模式文件(FILTER_1/2/3.spi)與所需的過濾參數被創建,然後三個子進程被髮射:然後

    spider spi/spd @filter_1 & # The first process to be launched by the main script and run in the background on one core 
    spider spi/spd @filter_2 & # The second background process run on the next core 
    spider spi/spd @filter_3 # The third process to be run in parallel with the two above and be finished before proceeding further. 
    

    這些過濾片段在端部放在一起。

因爲我想3個過濾步驟同時運行,我把前兩個背景用一個簡單的&並保持在前景中的最後一個,這樣主腳本進程將等待所有三在進一步重新組裝3個組塊之前完成(應該同時發生)。當我在前臺運行我的腳本時,這一切都可以正常工作,但它將很多來自許多子進程的輸出信息引發到終端上。我可以減少碳排放量

$ ./My_script 2>&1 > /dev/null 

但每個蜘蛛過程中仍然返回

*****Spider normal stop***** 

到終端。當我嘗試將主流程發送到背景時,它始終停止。

你有什麼建議我可以在後臺運行主腳本,並仍然得到它以並行方式運行3蜘蛛子進程?

謝謝!

+3

./My_script 2取代'>&1>的/ dev/null',這將stdout指向/ dev/null和stderr到原始標準輸出(您輸入命令的tty),嘗試使用'./My_script>/dev/null 2>&1'將兩者重定向到/ dev/null。訂單很重要。 –

回答

2

你可以在後臺啓動每個蜘蛛,存儲進程ID,你可以在wait命令後使用,如:

spider spi/spd @filter_1 & 
sp1=$! 
spider spi/spd @filter_2 & 
sp2=$! 
spider spi/spd @filter_3 & 
sp3=$! 
wait $sp1 $sp2 $sp3 

如果你想擺脫的輸出,適用於每個重定向命令。

更新:實際上,您甚至不需要存儲PID,沒有參數的wait將自動等待所有派生的子項。

0

首先,如果您使用bash,則可以使用wait等待每個進程退出。例如,所有的消息都將被打印,只有當所有進程已經完成:

sleep 10 & 
P1=$! 
sleep 5 & 
P2=$! 
sleep 6 & 
P3=$! 

wait $P1 
echo "P1 finished" 
wait $P2 
echo "P2 finished" 
wait $P3 
echo "P3 finished" 

您可以使用同樣的想法等待spider進程完成,然後才合併結果。

對於輸出,你可以嘗試重定向每一個到/dev/null而不是重定向腳本的所有輸出:

sleep 10 &> /dev/null &