シェルスクリプト内でコマンドの同時インスタンスを実行する

シェルスクリプト内でコマンドの同時インスタンスを実行する

まず最初に言っておきますが、私はまだ bash スクリプトを学習中で、多くのことに気づいていません。何か見落としていることがあれば、遠慮なく叱ってください。

今後は、2 つの異なるホストに ping を実行してファイルに出力する簡単な bash スクリプトを作成しています。これはすでに完了しており、動作しています。好奇心から、ping 出力の前後に日付を出力するスクリプトを追加しました。これにより、ping の実行にかかった時間がわかります。ping を 1 秒間隔、10 ping、2 ホストに設定しました。最初の日付 (かなり前のことですが...) のタイムスタンプは 14:36:20 でした。2 番目の日付 (ping 後) のタイムスタンプは 14:36:40 でした。

つまり、日付は両方の ping が完了するまで待機しました。つまり、ping は順番に実行されました。

これらを同時に実行して、スクリプトの実行に 20 秒ではなく 10 秒を費やすようにすることはできますか?

私のスクリプトの抜粋を以下に示します。

date >> teste.txt
cat hosts.txt |  while read output
do   ping -c 10 -i 1 "$output" >> teste.txt
done
date >> teste.txt

このスクリプトで実行したいことは他にもいくつかありますが、Barsa で満足のいく回答が見つからない場合にのみ質問することをお約束します。

PS: hosts.txt は、ping を実行したいホストを保存する場所です。

答え1

質問の文言は少しわかりにくいですが、次のような内容を探しているのだと思います:

command & 
command &
wait

スクリプトはバックグラウンドで 2 つのコマンドを実行し、応答を待機します。

ただし、あなたの場合は競合状態に注意する必要があります。おそらく、個々のコマンドの出力を一時ファイルに送信し、それをメイン ファイルに cat でコピーしたいので、次のような操作を行うことになります。

command > "${tmp1}" & 
command > "${tmp2}" & 
wait
cat "${tmp1}" "${tmp2}" >> "${main}"
rm -f "${tmp1}" "${tmp2}"

更新: xargsを試すこともできます(例:https://stackoverflow.com/questions/15755422/linux-bash-script-to-ping-multiple-hosts-simultaneously

答え2

GNU Parallel を使用すると、次のことが可能になります。

date >> teste.txt
cat hosts.txt |  parallel -j0 ping -c 10 -i 1 {} >> teste.txt
date >> teste.txt

関連情報