リモートマシンでスクリプトを並行して実行する方法は?


16

64コアのリモートマシンにsshできます。このマシンで640個のシェルスクリプトを並行して実行する必要があるとしましょう。どうすればいいですか?

640個のスクリプトを、それぞれ10個のスクリプトの64個のグループに分割できます。次に、これらの各グループを並列に実行するにはどうすればよいですか、つまり、使用可能なコアのそれぞれに1つのグループを追加します。

フォームのスクリプトでしょうか

    ./script_A &
    ./script_B &
    ./script_C &
    ...

どこscript_Aが最初のグループ、script_B2番目のグループなどに対応しますか?

1つのコアで実行される1つのグループ内のスクリプトは連続して実行できますが、グループをすべてのコアで並列に実行する必要があります。


それらがコアによって均等に分散されることは保証されません。このスレッドをご覧ください。stackoverflow.com/questions/13583146/...
ルイF・リベイロ

回答:


24

これはgnu parallelの仕事のように見えます:

parallel bash -c ::: script_*

利点は、スクリプトをコアごとにグループ化parallelする必要がないことです。

もちろん、スクリプトの実行中にSSHセッションをベビーシットしたくない場合は、nohupまたはscreen


これは良い答えであり、一般的な場合と同じように受け入れます。残念ながら、個人的にはリモートマシンの管理者権限がないため、parallelパッケージをインストールできません。ありがとう `
トム

10
並列にグローバルにインストールする必要はありません。自分のホームディレクトリからコピーを実行できるはずです。
dhag

bash -c不要な場合がありますparallel ::: ./script*。640スクリプトでは、おそらく非常によく似ています(たとえば、引数のみが異なります)。そのためには、GNU Parallelを直接使用してこれらの引数を設定し、単一のスクリプトを使用することを検討してください。
オレ丹下

リモートマシンにgnu parallelをどのようにインストールしますか?
トム

@Tomリモートマシンを使用しているという事実によって何が変わりますか?gnu.org/software/parallelから適切なパッケージを入手してインストールするだけです。
ドミトリーグリゴリエフ

5

出力を監視する必要がなく、スクリプトの実行にかかる限りsshセッションを開いたままにしておく限り、これは機能します。これらのいずれかが当てはまらない場合はscreen、複数のタブで使用することをお勧めします。次のようなことができます

screen
for script in script_A script_B script_C; do
  screen -t "$script" ./$script
done;

関係のない出力の監視-sshセッションを開いたままにしたくないでしょう。nohupの使用はどうですか?これにより、セッションが終了しない場合にスクリプトが停止しなくなりますか?また、「画面の推奨事項」も確認します。ありがとう!」
トム

nohupおそらく動作しますが、私はより精通しているだけでscreenなく、あなたにとって有用な場合とそうでない場合があります。
デビッドキング

2

多数のスクリプトジョブを開始して管理するには、リソースの使用状況(CPU、メモリ、優先度)を制御し、ジョブの状態(待機、一時停止、実行中、終了)を確認する何らかの管理ソフトウェアが必要です。

Grid Engineはそのために構築されています。たとえば、Sun Grid Engine(http://wiki.gridengine.info/wiki/index.php/Main_Page)またはOpen Grid Scheduler( http://gridscheduler.sourceforge.net/)。開始する前に、管理者が適切なソフトウェアをインストールする必要があります。管理者は、マシン上で実行されている何百ものプロセスを見るのではなく、喜んでそれを行い、それらを制御することはできません。

一般に、管理者はマシンを分割できるスロット数を定義し、ジョブをキューに送信してジョブが消費するスロット数を指定すると、Grid Engineはシステム全体の使用状況を監視し、それに応じてジョブを実行しますadminによって定義されたキューイングポリシー。たとえば、x個以下のジョブを同時に実行することはできません。残りのジョブは待機状態でキューに入れられ、以前のジョブが終了した後に解放されます。



0

私はこれを何度も行ってきましたが、通常は自分のスクリプトをロールして、ジョブ制御でジョブを実行します。一般的に、ファイルで実行するすべてのスクリプトの名前がある場合、ソリューションは次のようになります。

#!/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

それはブルートフォースですが、効果的です。さらに、システムにパラレルなどの追加ソフトウェアを追加する必要はありません。

大きな問題は、最も遅いスクリプトが終了するまでwaitコマンドが待機するため、時間を浪費する可能性があることです。この状況を処理するスクリプトを作成しましたが、想像できるほど複雑になります。すべてのスクリプトがほぼ同じ時間で実行される場合、これはうまく機能します。

別の問題は、最高のパフォーマンスを決定するためにMAX_PROCSを調整する必要がある場合があることです。

もちろん、ssh接続の数は扱いにくい場合があります。この場合、このスクリプトをリモートホストに移動し、「ssh ...」行を変更してスクリプトを直接実行するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.