リモートコマンドの並列実行

リモートコマンドの並列実行

設定:

Linuxサーバーのリストを含むファイルを処理し、次のようにsshを介してそのリモートサーバーでbashまたはperlスクリプトを実行するPHPスクリプト(現在PHP 5.5用に作成されていますが、実行中のサーバーには7.4があります)があります。

exec("ssh -o StrictHostKeyChecking=no -p $connectivity_port $user@$server \"bash -s\" -- < $file $scriptargs 2>&1", $result, $exit_code);

これらの操作はすべてうまくいきますが、実行されるコードによっては時間がかかります。ローカルなので、スクリプト出力以外に処理することはほとんどありません(PHPを実行しているサーバー上のローカルファイルへのロギングといくつかのスクリプト出力がたくさんあります)。

ターゲット

bashで並行してPHPスクリプトを実行するための最良の/最も簡単な方法/ツールが何であるか疑問に思います。すべての出力がリスト内のサーバーの順序であることを確認してください(例:一度にxサーバー、おそらく10、実行時間を短縮)

私の研究とバージョンの制約で見ると、PHP自体は行く道ではないようですが、bashはその声明に合わないようですが、私は喜んで間違っている可能性があり、他の方法を学ぶことに興味があります。

ベストアンサー1

あなたは次のことをしますbash

declare -r MAX_PARALLEL='5' WAITSEC='0.1'

i=0
server[i]=...
port[i]=...
user[i]=...
command_file[i]=...
scriptargs[i]=...
((i++))
server[i]=...
port[i]=...
user[i]=...
command_file[i]=...
scriptargs[i]=...
((i++))

count=$i
for((i=0;i<count;i++)); do
    while [ $(jobs -r | wc -l) -gt "$MAX_PARALLEL" ]; do
        sleep "$WAITSEC"
    done
    ( ssh -o StrictHostKeyChecking=no -p "${port[i]}" "${user[i]}@${server[i]}" \
"bash -s" <"${file[i]}" "${scriptargs[i]}" >output_file.$i 2>&1
      echo $? >exit_code.$i ) &
done

残念ながら、正しい作業数を得る簡単な方法はないようです。したがって、この方法はコマンドラインに改行文字が含まれていない場合にのみ正しく機能します。

おすすめ記事