2013-08-25 54 views
2

我試圖在後臺運行幾臺linux機器上的腳本。我的bash腳本是這樣的:等待並行遠程進程完成bash ssh

for i in {1..1000}; do 
    for j in {1..20}; do  
    ssh -n -f remotehost$j "sh -c 'cd /blah/; nohup ./script.sh $i > /dev/null 2>&1 &'" 
    NPROC=$(($NPROC+1)) 
    if [ "$NPROC" -ge 40 ]; then 
     echo "Waiting for work to finish" 
     wait 
     NPROC=0 
    fi   
    done  
done 

這是我試圖限制在服務器上的負載和只有40個流程的淨在任何給定的時間運行在20臺主機。這雖然不起作用,並且所有進程都在同一時間啓動。您可以請指導我如何等待遠程後臺進程完成或防止在給定的遠程主機上啓動超過n個進程。

回答

2

隨着GNU並行,你可以做到這一點,以每20臺機器上運行40個作業:

parallel -j20 seq 1000 \| parallel -j40 -I I ssh server{} \''"cd /blah/; ./script.sh I"'\' ::: {1..20} 

的拆裝硬盤會盡量做一個完整的安裝;如果 失敗,則進行個人安裝;如果失敗,最小 安裝:

wget -O - pi.dk/3 | bash 

或:

curl pi.dk/3/ | bash 

手錶簡要介紹介紹視頻: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

走過教程(男子parallel_tutorial)。你命令行 愛你。

0

在前臺運行遠程進程,並把ssh背景:

ssh -n -f remotehost$j "sh -c 'cd /blah/; ./script.sh $i > /dev/null 2>&1 '" & 
+0

看起來非常有希望,但等待不起作用,所有進程一起啓動。檢查了我的輸入,以確保它是正確的,但無法找到爲什麼這不起作用。 – Atlas

+0

確保遠程命令不會重定向stdin。其中一個標準文件描述符必須保持連接到SSH連接,以便ssh將等待遠程命令完成。 – Barmar

1

您應該使用是爲了這個目的而設計的工具。我使用pssh(又名並行ssh),它工作得很好。

此外,它在普通Linux存儲庫中已廣泛使用,例如在Ubuntu中,您可以使用sudo apt-get install pssh進行安裝。

0

您可以使用xargs限制的進程數:

maxPerServer=2 
for j in {1..20}; do 
    echo -n {1..1000} | xargs -P "$maxPerServer" -d ' ' ssh -n -f remotehost$j "sh -c 'cd /blah/; ./script.sh {} > /dev/null 2>&1 '" & 
done 

此代碼將每個服務器上運行最多2個進程。

+0

也試過這種方法。腳本執行正常但沒有任何反應。即不啓動遠程進程。 – Atlas

+0

你確定嗎?嘗試在腳本的末尾放置「wait」。 –

0

一個並行的SSH客戶端(pdsh,cssh,pssh等)將會是一條路。