inotify スクリプトは最初の変更後に停止します

inotify スクリプトは最初の変更後に停止します

に触発されたこのスーパーユーザーの回答次のスクリプトを作成しcopy_library.sh、 というファイルと同じフォルダーに保存しましたlibrary.bib

#!/bin/sh
while inotifywait -e close_write library.bib; do
    cp -f ./library.bib ../other_place/ ;
    echo "Library copied"
done

./copy_library.shこのスクリプトを手動で開始し、最初のコピー後にプロセスを終了すると(正常に動作します)、

londonrob ~/mydir
> ./copy_library.sh 
Setting up watches.
Watches established.
library.bib CLOSE_WRITE,CLOSE 
Library copied
Setting up watches.
Watches established.
londonrob ~/mydir
>

それ以上の変更は追跡されません。このスクリプトを手動で起動しなくても、継続的に「バックグラウンド」で実行されるように、何らかの操作を行う必要があるはずです。

しかし何?

答え1

man ページからinotifywait:

inotifywait は Linux の inotify(7) インターフェースを使用してファイルの変更を効率的に待機します。シェル スクリプトからのファイルの変更を待機するのに適しています。イベントが発生すると終了するか、継続的に実行して発生するイベントを出力することができます。

そして

-m, --monitor 単一のイベントを受け取った後に終了するのではなく、無期限に実行します。デフォルトの動作は、最初のイベントが発生した後に終了することです。

編集: 15 秒ごとに追加されるログがあります。次のスクリプトは、inotifyread によって出力される行ごとに while ループを実行します。

#!/bin/sh

inotifywait -e modify /tmp/modem_log.csv -m | while read line; do
    echo "$line"
    echo "Copy coperation here..."
done

もちろん、あなたの場合は、イベント (modify) を close_write に変更する必要があります。

関連情報