wait コマンドを使用したプロセスの同期
このステップでは、wait コマンドを使用してプロセスを同期する方法を学びます。これにより、親プロセスはバックグラウンドプロセスの完了を待つことができます。
wait コマンドとは何か?
wait コマンドは、シェルスクリプト内で使用され、1 つまたは複数のバックグラウンドプロセスが完了するまでスクリプトの実行を一時停止します。これは、特定のタスクが完了してから後続の操作を行う必要がある場合に特に有用です。
引数なしでの wait コマンドの使用
引数なしで wait コマンドを使用すると、すべてのバックグラウンドプロセスが完了するまで待機します。
これを示すスクリプトを作成しましょう。
-
プロジェクトディレクトリに移動します。
cd ~/project
-
新しいスクリプトを作成します。
nano wait_demo.sh
-
スクリプトに以下の内容を追加します。
#!/bin/bash
echo "Starting background tasks..."
## Start two background tasks
./long_task.sh &
./long_task.sh &
echo "Waiting for all background tasks to complete..."
wait
echo "All background tasks have completed!"
-
Ctrl+O を押してファイルを保存し、Enter を押し、最後に Ctrl+X でエディタを終了します。
-
スクリプトを実行可能にします。
chmod +x wait_demo.sh
-
スクリプトを実行します。
./wait_demo.sh
次のような出力が表示されます。
Starting background tasks...
Starting long task with PID 1236
Starting long task with PID 1237
Waiting for all background tasks to complete...
Long task completed
Long task completed
All background tasks have completed!
「All background tasks have completed!」というメッセージは、2 つの長時間実行されるタスクが両方とも終了した後にのみ表示されることに注意してください。これは、wait コマンドがすべてのバックグラウンドプロセスが完了するまでスクリプトを一時停止する仕組みを示しています。
特定の PID での wait コマンドの使用
wait コマンドを使用して、特定のプロセスの PID を指定してそのプロセスの完了を待つこともできます。
-
別のスクリプトを作成します。
nano wait_pid_demo.sh
-
以下の内容を追加します。
#!/bin/bash
echo "Starting background tasks..."
## Start two background tasks and capture their PIDs
./long_task.sh &
pid1=$!
./long_task.sh &
pid2=$!
echo "First process PID: $pid1"
echo "Second process PID: $pid2"
echo "Waiting for the first task to complete..."
wait $pid1
echo "First task has completed!"
echo "Waiting for the second task to complete..."
wait $pid2
echo "Second task has completed!"
-
Ctrl+O を押してファイルを保存し、Enter を押し、最後に Ctrl+X でエディタを終了します。
-
スクリプトを実行可能にします。
chmod +x wait_pid_demo.sh
-
スクリプトを実行します。
./wait_pid_demo.sh
出力から、スクリプトが各プロセスの完了を個別に待機することがわかります。
$! 変数には、最近実行されたバックグラウンドプロセスの PID が格納されます。これにより、PID を取得し、後で wait コマンドで使用することができます。