次のスクリプトは、TARGETディレクトリのclose_writeイベントを監視し、ファイルに対して特定のタスクを実行します。
#!/bin/bash
TARGET=/home/*/ftp/files
inotifywait -m -r -e close_write $TARGET |
while read directory action file
do
if [[ "$file" =~ .*jpg$ ]] || [[ "$file" =~ .*mp4$ ]]
then
# do sth with the file
fi
done
/home/sammy/ftp/files
egとサブファイルのclose_writeイベントを正しく監視しています/home/neo/ftp/files
。
私が直面している問題は、Mikeのような新しいユーザーが作成されたときに時計が機能しなくなったため、スクリプトを再実行する必要があることです。知る新しいユーザーのパスについては、nohupプロセスを終了して再実行する必要があります。
新しく作成されたディレクトリでinotifywaitについて学ぶ方法はありますか?
答え1
-r
監視しているディレクトリの下に作成された新しいディレクトリを自動的に見つけます。しかし、ここではルートなどを/home/sammy/ftp/files
取得し、その下にないため、検出されません。 (シェルは実行する前にglobを拡張することを忘れないでください。)/home/neo/ftp/files
/home/mike
/home/*/ftp/files
inotifywait
原則として、コンテンツ全体を視聴/home
し、そこにないコンテンツは手動で無視できます/home/*/ftp/files
。しかし、これは多くの監視を生成し、望ましくないイベントを多く生成します。
より良いアイデアは、/home
ディレクトリに加えてさらに監視/home/*/ftp/files
し、新しいサブディレクトリが追加されたら監視を再開することです/home
。新しいユーザーが常にすぐにftp/files
ディレクトリを作成するのはそれほど悪くはありません。ただし、新しいディレクトリが表示されるまで明示的に待つ必要があるかもしれません。これにより、新しいディレクトリを作成する前にスクリプトリセットの競合に陥り、見逃すことはftp/files
ありません。inotifywait
ftp/files
(再起動すると、inotifywait
新しいファイルを生成できるウィンドウが作成されますが、スクリプトはこれを失います。inotifyを直接サポートするいくつかのプログラミング言語を使用する方が安全です。)
/home/$user/files/ftp
まったく異なるアプローチは、関連コンテンツがもはや配置されないようにディレクトリ構造を変更することです/srv/ftp/$user
。その後、時計を追加するだけで、/srv/ftp
問題なく自動的に新しいユーザーを引き付けることができます。