64コアのリモートマシンにSSH接続できます。このマシンで640のシェルスクリプトを並行して実行する必要があるとしましょう。どうすればよいですか?
640個のスクリプトをそれぞれ10個のスクリプトの64個のグループに分割しています。次に、これらの各グループをどのように実行しますか並列、つまり、使用可能なコアのそれぞれに1つのグループ。
フォームのスクリプトになりますか
./script_A &
./script_B &
./script_C &
...
ここで、script_A
は最初のグループに対応し、script_B
は2番目のグループに対応するなど、十分ですか?
1つのコア内で実行される1つのグループ内のスクリプトは順次実行しても問題ありませんが、すべてのコアにわたってグループを並行して実行する必要があります。
これはGNU Parallelの仕事のように見えます:
parallel bash -c ::: script_*
利点は、コアごとにスクリプトをグループ化する必要がないことです。parallel
がそれを行います。
もちろん、スクリプトの実行中にSSHセッションをベビーシッターにしたくない場合は、Nohup
またはscreen
を使用する必要があります
これは、出力を監視する必要がなく、スクリプトの実行にかかる限り、sshセッションを開いたままにしておけば問題ありません。これらのいずれかが当てはまらない場合は、複数のタブでscreen
を使用することをお勧めします。あなたは次のようなことをすることができます
screen
for script in script_A script_B script_C; do
screen -t "$script" ./$script
done;
多数のスクリプトジョブを開始して管理するには、リソースの使用状況(CPU、メモリ、優先度)を制御する何らかの管理ソフトウェアが必要です。ジョブのステータス(待機、一時停止、実行中、完了)を確認してください。
たとえば、Sun Grid Engine( http://wiki.gridengine.info/wiki/index.php/Main_Page )またはOpen Grid Scheduler( http: //gridscheduler.sourceforge.net/ )。開始する前に、管理者が適切なソフトウェアをインストールする必要があります。管理者は、マシン上で実行されている何百ものプロセスを確認する代わりに、喜んでそれを行い、それらを制御することはできません。
一般に、管理者はマシンを分割できるスロットの数を定義し、ジョブをキューに送信し、ジョブが消費するスロットの数を指定すると、Grid Engineはシステム全体の使用状況を監視し、ジョブを次のように実行します管理者が定義したキューイングポリシー。例えば同時に実行できるジョブはx個までです。残りのジョブは待機状態でキューに入れられ、前のジョブが終了すると解放されます。
分散シェルを試すことができます。ダウンロード元: http://sourceforge.net/projects/dsh/
私はこれを何度も行ってきましたが、通常は自分のスクリプトをロールして、ジョブ制御でジョブを実行します。一般的に、ファイルで実行するすべてのスクリプトの名前がある場合、ソリューションは次のようになります。
#!/bin/bash
scripts=$(cat scriptfiles.txt)
declare -i NUM=0
declare -i MAX_PROCS=30
for script in "$scripts"
do
NUM=$((NUM+1))
ssh remote.Host.ip "${script}" > ${script}.log 2>&1 &
if [ $NUM -ge $MAX_PROCS ];then
echo "Waiting for $NUM processes to finish."
wait
NUM=0
fi
done
echo "Waiting for final $NUM processes to finish."
wait
exit
それは総当たりですが、効果的です。さらに、並列処理のような追加のソフトウェアをシステムに追加する必要はありません。
大きな問題は、待機コマンドが最も遅いスクリプトが完了するのを待つことであり、これは時間を浪費する可能性があります。この状況に対処するためにスクリプトを作成しましたが、想像できるように、スクリプトはさらに複雑になります。すべてのスクリプトがほぼ同じ時間で実行される場合、これはうまく機能します。
別の問題は、最高のパフォーマンスを決定するためにMAX_PROCSを調整する必要がある場合があることです。
もちろん、ssh接続の数は扱いにくい場合があります。この場合、このスクリプトをリモートホストに移動し、「ssh ...」行を変更するだけで、スクリプトを直接実行できます。