web-dev-qa-db-ja.com

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

私はまだ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するホストを保存する場所です。

3
Rafael Umbelino

あなたの質問の言い回しは少し理解しにくいですが、私はあなたが次のようなものを探していると思います:

command & 
command &
wait

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

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

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

4
Little Code

GNU Parallelを使用すると、次のことができます。

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