シェルスクリプトでファイルを待つ方法は?

シェルスクリプトでファイルを待つ方法は?

/tmp呼び出しディレクトリにファイルが表示されるのを待つシェルスクリプトを作成しようとしています。sleep.txtファイルが見つかると、プログラムは停止します。それ以外の場合は、ファイルが見つかるまでプログラムがスリープ状態(停止)になるようにしたいと思います。ここで test コマンドを使用するとします。そのように

(if [ -f "/tmp/sleep.txt" ]; 
then stop 
   else sleep.)

私はシェルスクリプトを書くのが初めてですが、助けてくれてありがとう。

ベストアンサー1

Linuxでは、次のものを使用できます。inotifyカーネルサブシステムは、ディレクトリにファイルがあるまで効果的に待ちます。

inotifywait  -e create,moved_to,attrib --include '/sleep.txt$' -qq /tmp
# script execution continues ...

注:ファイルがすでに存在していても登録するようにattribイベントを追加しました。touch /tmp/sleep.txt


sleep.txtが次のように表示される場合inotify待つつまり、時計がビルドされる前にファイルが作成またはタッチされ、その後は再び呼び出されない場合は、次のようにコードを拡張できます。

coproc inw {
    LC_ALL=C inotifywait  -e create,moved_to --include '/sleep.txt$'  /tmp 2>&1
}
while IFS= read -r -u "${inw[0]}" line; do
    if [ "$line" = "Watches established." ]; then
        break
    fi
done
if [ -f /tmp/sleep.txt ]; then
    kill $inw_PID
else
    wait
fi
# script execution continues ...

固定間隔ポーリングと比較したこのアプローチの利点

while [ ! -f /tmp/sleep.txt ]; do sleep 1; done
# script execution continues ...

もっと寝るのはあなたのコースです。 inotifyイベント仕様(スクリプトなど)を使用して、create,attrib次のファイルが作成または開かれたときにのみ実行されるようにスケジュールします。/tmp一定の間隔でポーリングすると、時間が増えるたびにCPUサイクルが無駄になります。

おすすめ記事