このエントリーをはてなブックマークに追加


複数のプロセスが終了するまで待機する・waitコマンド

シェルの組込みコマンドであるwaitコマンドを使用すると、バックグラウンドで起動したプロセスが終了するまで待機するようになります。
以下にwaitコマンドを使用した例を記します。
本資料では、CentOSを使用しシェルはbashを利用しました。


関連記事

whichでみつからないwaitコマンド

waitコマンドはシェルの組込みコマンドなのでwhichでwaitコマンドのありかを探してもみつかりません。

$ which wait
/usr/bin/which: no wait in (/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/sakura/bin)

waitコマンドを使用した簡単なシェルスクリプトで実験

親(parent.sh)と子のシェルスクリプト(child.sh)を2つ作成しました。
parent.shからchild.shを複数バックグラウンドで起動(&を付けてバックグランドで起動)しwaitでchild.shが終了するのwaitで待ちます。
バックグランドで動作していたchild.shが全て終了するとparent.shが終了メッセージを表示します。
以下に2つのシェルを記します。

waitコマンド動作確認用シェルスクリプト

以下にwatiコマンド動作確認用シェルスクリプトを記します。

  • parent.sh
    #!/bin/bash
    ./child.sh sakura 3 &
    ./child.sh tsubaki 2 &
    ./child.sh suzuran 1 &
    wait
    echo script is finished.
     
    parent.shは、child.shをバックグラウンドで起動します。
    1つ目の引数は画面に表示する文字列、2つ目の引数は繰り返しの回数になります。
    本スクリプトでは、child.shを3つ起動しています。
  • child.sh
    #!/bin/bash
    
    if [ $# -ne 2 ]; then
      echo "Usage: `basename $0` <message> <repeat count>"
      exit 1
    fi
    
    for i in `seq 1 $2`
    do
      echo $1
      sleep 1
    done
    exit 0
     
    child.shは、1つ目の引数をechoで表示し、2つ目の引数分echoを繰り返します。
    表示後sleepにより1秒停止します。

waitコマンド動作確認用シェルスクリプトを動かしてみる

parent.shを起動すると以下のように出力されます。
出力結果だけを見るとwaitコマンドの動作がわからないのですが、以下の出力は3つのchild.shプロセスが1つ目の引数を表示したあと、1秒停止します。
2つ目の引数分、メッセージを表示しています。
3つのchild.shが終了したらscript is finishedが表示されます。

$ chmod +x parent.sh child.sh 
$ ./parent.sh 
sakura
tsubaki
suzuran
sakura
tsubaki
sakura
script is finished.

以上、シェルの組込みコマンドであるwaitコマンドについての記事でした。



添付ファイル: filechild.sh 542件 [詳細] fileparent.sh 759件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 22:26:53