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

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

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

1#!/bin/bash
2process1 &
3process2 &
4process3 &
5process4 &
6 
7#ここで処理を待って
8 
9process5
10exit

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

1#!/bin/bash
2(process1; touch /tmp/myprocess/p1) &
3(process2; touch /tmp/myprocess/p2) &
4(process3; touch /tmp/myprocess/p3) &
5(process4; touch /tmp/myprocess/p4) &
6 
7#ここで処理を待って
8for i in {1..4}; do
9  inotifywait -e CREATE -qq /tmp/myprocess/
10done
11 
12process5
13exit

説明!

1inotifywait -e CREATE -qq /tmp/myprocess/

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

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

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

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

コメントを残す

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

StatCounter - Free Web Tracker and Counter