inotifywaitを使ってプログラム終了を検知する


Linux kernelにinotifyが組み込まれている環境では、inotify-tools パッケージ のinotifywaitを使って、パラレル実行した結果が全部終わるのを待ってから、次に進むようなスクリプトが作れるらしい。(kernel 2.6.13以降ならinotifyを使えるらしい)
inotify-tools

process1~process4までをいっぺんに並列実行して
それが全部終わったprocess5を実行させたい

#!/bin/bash
process1 &
process2 &
process3 &
process4 &

#ここで処理を待って

process5
exit

こんなスクリプトを書きたい場合・・・

#!/bin/bash
(process1; touch /tmp/myprocess/p1) &
(process2; touch /tmp/myprocess/p2) &
(process3; touch /tmp/myprocess/p3) &
(process4; touch /tmp/myprocess/p4) &

#ここで処理を待って
for i in {1..4}; do
  inotifywait -e CREATE -qq /tmp/myprocess/
done

process5
exit

説明!

  inotifywait -e CREATE -qq /tmp/myprocess/

ここは、/tmp/myprocess/ にファイルが作られたことを検知する。
/tmp/myprocess/ に何でもいいから1つファイルが作られるまで、待ちとなる。

この処理をfor文で4回繰り返している。つまり、ファイルが4つ作られるまでは、ここで待つことになる。

問題点
RHEL/CentOS5では、inotify-toolsが標準で入っていないこと。
コンパイルしてインストールする必要がある。

注!
このスクリプトは、例えば、100個ぐらい走らせたい処理があるけど、CPU coreが4つあるから、同時実行は4つとして、終わり次第次々に実行させていきたい。という場合には使えません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください