2

バックグラウンドで複数の Linux マシンでスクリプトを実行しようとしています。私のbashスクリプトは次のようになります:

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

これは、サーバーの負荷を制限し、常に 20 のホストで 40 のプロセスしか実行できないようにするための私の試みです。ただし、これは機能せず、すべてのプロセスが同時に開始されます。リモート バックグラウンド プロセスが完了するのを待つ方法、または特定のリモート ホストで n 個を超えるプロセスが起動しないようにする方法を教えてください。

4

6 に答える 6

2

GNU Parallel を使用すると、これを実行して、20 台のマシンのそれぞれで 40 個のジョブを実行できます。

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

10 秒のインストールでは、完全なインストールが試行されます。それが失敗した場合は、個人的なインストール。それが失敗した場合は、最小限のインストール:

wget -O - pi.dk/3 | bash

また:

curl pi.dk/3/ | bash

簡単な紹介については、紹介ビデオをご覧ください: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

チュートリアルを実行します (man parallel_tutorial)。あなたはそれを愛しているコマンドラインです。

于 2013-08-29T16:36:58.953 に答える
1

GNU Parallel もチェックアウトしてください: http://www.gnu.org/software/parallel/

于 2013-08-25T19:23:00.467 に答える
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 つのプロセスを実行します。

于 2013-08-25T18:40:48.640 に答える
0

sshリモート プロセスをフォアグラウンドで実行し、バックグラウンドに置きます。

ssh -n -f remotehost$j "sh -c 'cd /blah/; ./script.sh $i > /dev/null 2>&1 '" &
于 2013-08-25T18:26:42.810 に答える