特定のファイルが変更/削除されない限り(または特定のディレクトリで作成されたファイル、または...)、スクリプトをスリープさせたい。これはエレガントな方法で達成できますか?私の頭に浮かぶ最も簡単なことは、ステータスを再度確認する前にしばらくスリープするループですが、おそらくもっとエレガントな方法がありますか?
特定のファイルが変更/削除されない限り(または特定のディレクトリで作成されたファイル、または...)、スクリプトをスリープさせたい。これはエレガントな方法で達成できますか?私の頭に浮かぶ最も簡単なことは、ステータスを再度確認する前にしばらくスリープするループですが、おそらくもっとエレガントな方法がありますか?
回答:
Linuxでは、カーネルのinotify
機能を使用できます。スクリプト用のツールは、そこにあります:inotify-tools。
wikiからの使用例:
#!/bin/sh
EVENT=$(inotifywait --format '%e' ~/file1) # blocking without looping
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'
# etc...
実際、entr(1)はファイルが変更されると任意のコマンドを実行し、アプリケーションサーバーを再起動するための自動リロードオプションも提供します。
編集:いくつかの例
ソースファイルが変更された場合に再構築する
$ find *.c | entr make
ファイルが変更された場合のテストサーバーの起動と自動再読み込み
$ ls *.py | entr -r python main.py
引数を+/path/to/fifo
指定entr
すると、名前付きパイプに変更される各ファイルの名前を書き込むように指示することで、より複雑なスクリプトを作成できます。以下は、現在のディレクトリのMarkdownファイルが編集されるとHTMLに変換します
$ ls *.md | entr +/tmp/notify &
$ while read F
> do
> markdown2html $F
> done < /tmp/notify
entr
変更されたファイルの名前を渡す方法はありますか?
/_
引数($
Perlの_に多少類似)は、変更された最初のファイルの名前に置き換えられます