/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サイクルが無駄になります。