fsniperにハマる
fsniper,すごく面白いです.
fsniperによる新規ファイルの自動処理 | OSDN Magazine
fsniperを使用すると、監視対象のディレクトリを指定し、それらのディレクトリで新しいファイルが作成されたときにスクリプトを実行することができる。fsniperはディレクトリの監視にinotifyを利用するので、ファイルシステムで変化が起こると定義したアクションが直ちに実行される。これによりfsniperは定時実行のcronジョブより即時的で、より効率的となる。
よく,ブラウザをインターフェースにして,ファイルをアップロードしたりしますよね.最近ですと.
そして,そのファイルを何か操作したいですよね.加工するとか,移動するとか.
そうしたら,
- cronで3分とか1分とか,そのアップロードディレクトリにファイルが新規登録されたか見張っている
- 「アップロードしますた!」と伝えるためのボタンを付ける
とかやってましたよね.でも,fsniperを使えば,OSレベルで自動的です.
しかし,上記のsourceforgeの記事だけ読んで作業してみると,いかにも初心者っぽいハマリ方をしてしまいました.
- ハマりその一〜「%%」をファイル名だと思ってしまう
「%%」は絶対パスです./var/lock/my.lockの更新を検知して/home/myに移動させるのに,
watch { /var/lock{ my.lock { # %% is replaced with the filename of the new file handler = mv /var/lock/%% /home/my } } }
と書いてはいけません.
watch { /var/lock{ my.lock { # %% is replaced with the filename of the new file handler = mv %% /home/my } } }
と書きます.
- ハマりその二〜複数ファイルの同時更新
watch { /var/lock{ *.lock { # %% is replaced with the filename of the new file handler = execute_some_command %% } } }
と設定した場合,/var/lock/foo.lockと/var/lock/bar.lockが同時に更新される場合,execute_come_commandコマンドが,同時に立ち上がります.
そんな場合,例えば単純な
watch { /var/lock{ *.lock { # %% is replaced with the filename of the new file handler = echo %% "が更新されました"|mail root } } }
みたいな場合は良いのですが,
watch { /var/lock{ *.lock { # %% is replaced with the filename of the new file handler = echo %% "が更新されました" >> /var/log/fsniper.log } } }
みたいな場合,ファイル書き込みが同時に発生するので,ファイルが良くて順番が不定,悪くて内容がぐちゃぐちゃになります.
このような場合,分けるしかありません.
watch { /var/lock{ foo.lock { # %% is replaced with the filename of the new file handler = echo %% "が更新されました" >> /var/log/fsniper.log } bar.lock { # %% is replaced with the filename of the new file handler = echo %% "が更新されました" >> /var/log/fsniper.log } } }
気をつけて使いましょう!