黄脳エンジニアメモ

仕事や趣味やらで調べたり試したりした情報をただただ書き並べてるだけ

*

[Linux]ホットフォルダ/ファイル検出して処理をしたい

      2015/01/21

ホットフォルダ本来はどうすべきか

ファイルの検出を同期で行うのが正しいです。ファイルの作成や削除はフォルダの更新を検出すればいいのです。

本来はファイルを検出したらそのファイルが他のプログラムがopenしていないことを確認することでファイルが書き終わっている(成功してても失敗でも)と認識すべきです。それで壊れていたのならエラー処理(エラーフォルダに移動するのが鉄板)して次のファイルを処理させます。

とはいっても専用のプログラムをシステムコール使って実装しないとできないので簡単にはいきませんね。

Linuxならinotify-toolsがある

inotify-toolsはファイルサーバの同期などで使うツールですが、ファイル操作検出してくれるツールで今回はinotifywaitというコマンドを使えばあんがいすっきり実装できます。

inotify-toolsインストール

下記のようにして inotify-tools を導入すると inotifywaitが使えるようになります。インストールはrootで行います。

ファイル検出の方法

下記のコマンドラインで書き込み処理のCLOSEと、ファイルが移動してきたことを検知できます。

この状態でこの/tmp/hotfolderにファイルをコピーしてxxx.xmlで保存すると。

移動の場合は

検出するイベントの指定で -e  CLOSE_WRITE,MOVED_TO としていて CREATE とMODIFYは指定しません(これ重要)。ネットでこのコマンドの使い方みると多くはCREATE とMODIFYを使う例が多くみられますがこればNGです。CREATEはファイル名が登録された状態でファイルの中身は書き込み中の場合があります、MODIFYは書き込み中でまだ書いている途中の可能性があります。なのでファイルが完成しているCLOSE_WRITEとMOVED_TOで判断する必要があるのです。

inotifywaitを使って実装してみる

最初のスクリプトのsleepの部分を置き換えてinotifywaitを使ってみました。/tmp/hotfolderにファイルの書き込みが終わるか、ファイルが移動やリネームされるのが終わるまで待ちますので。10秒のタイムラグはなくなります。-tで10を指定しているのはおまじないです。ずーっとまってしまうのが怖かったのでいったん10秒で抜けてファイルがあるかみています。 また最初にファイルの存在チェックしているのは、すでに格納されたファイルがあった場合に処理してから待たせるためです。しかし、このせいで起動直後、書き込み中のファイルを検出してしまうリスクはあります。

もう少しここは気を利かせる方法をまた考えます。

inotifywaitの使い方

コマンドのヘルプを一応コピーしておきます。

ページ: 1 2

 - Linux , , , , ,

336

336

  関連記事

no image
正規表現編集とテストを簡単に行える正規表現チェックツール

正規表現の編集やテストをさくさくやりたい その場にLinuxの環境でもあればse …

no image
[AjaXplorer]レンタルサーバのファイル管理

レンタルサーバのファイル管理するエクスプローラがほしい サーバにはレンタルサーバ …