シェルスクリプトでコマンドを並列実行する方法を2つ紹介します。
1. &
(バックグラウンド実行) と wait
最もシンプルな並列処理の方法です。コマンドの末尾に &
を付けると、そのコマンドはバックグラウンドで実行されます。wait
コマンドは、バックグラウンドで実行中のすべてのプロセスが終了するまで待機します。
#!/bin/bash
command1 &
command2 &
command3 &
wait
echo "All commands finished."
command1
、command2
、command3
はそれぞれ別のプロセスとしてバックグラウンドで実行されます。wait
コマンドによって、すべての処理が完了するまでスクリプトの実行が一時停止します。 全てのコマンドの実行が完了した後、"All commands finished." が出力されます。
2. 制限付き並列処理
配列と wait -n
を組み合わせることで、並列実行数を制限した処理が可能です。
#!/bin/bash
commands=("command1 arg1" "command2 arg2" "command3 arg3")
max_parallel=2 # 最大並列数
running=0 # 現在実行中のプロセス数
for command in "${commands[@]}"; do
while [[ $running -ge $max_parallel ]]; do
wait -n # いずれかのバックグラウンドプロセスが終了するまで待機
running=$((running - 1)) # 終了したプロセス数を減算
done
eval "$command" & # コマンドをバックグラウンドで実行
running=$((running + 1)) # 実行中のプロセス数を加算
done
wait # 全てのバックグラウンドプロセスが終了するまで待機
commands
配列に実行したいコマンドを格納します。 max_parallel
で並列実行数を制限します。 running
変数で現在実行中のプロセス数を追跡します。
for
ループでコマンドを一つずつ取り出し、while
ループで実行中のプロセス数が max_parallel
を超えないように制御します。 wait -n
は、いずれかのバックグラウンドプロセスが終了するまで待機します。プロセスが終了すると、running
をデクリメントし、次のコマンドを実行します。 eval
は、文字列として格納されたコマンドを実行するために使用します。
この方法では、最大並列数を max_parallel
で指定した値に制限しながらコマンドを実行できます。 wait -n
を使うことで、プロセスが終了するたびに次のコマンドを実行するため、効率的に並列処理を行うことができます。 最後に wait
で全てのバックグラウンドプロセスが完了するまで待機します。