黄脳エンジニアメモ

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

*

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

      2015/01/21

ホットフォルダ機能ってどうやるのか

ホットフォルダは、あらかじめ決められたフォルダにファイルをコピーやファイル転送し、それを検出してそのファイルに対して処理をする仕組みのことで、オープンシステム(言い方が古いかな)になってからシステム間通信でよくつかわれている機構のことです。この機構の「まともなやり方」をLinuxで考えてみました。

単純な実装をして失敗してるのを何度かみたことがあるいます。たとえば、下記のような単純なスクリプトです。/tmp/hotfoler ディレクトリの中に”*.xml”にヒットするファイルがあるか見て、なければ10秒待つ、あれば処理(下記ではファイル名を表示して削除するようにしている単純なサンプル)します。

遅延を嫌ってsleepをいれないようなタコな実装をしてるのをたまに見かけます、CPUをめちゃ食って暴走しますので、1秒でも100msでもいいので待つようにします。

#!/bin/bash
cd /tmp/hotfolder
while [ 1 ]
do
	HITFILE=`ls -1rt *.xml 2>; /dev/null | head -n 1`
	if [ -z "${HITFILE}" ]
	then
		sleep 10
	else
		# ファイル検出時の処理
		# 例として行数を表示して削除している
		wc -l ${HITFILE}
		rm ${HITFILE}
		#
	fi
done

実はこの処理は問題があります。

すぐには検出しない

ファイル検出を10秒間隔でやってますので検出されるのは0~10秒かかります。もちろん間隔を狭めて1秒にすれば1秒間隔になりますが。タイミングが悪いと1分間に60ぐらいしか処理できないかもしれません。

ファイルが切れて読まれてしまう

ファイルの存在チェックをしているだけなので、ftpなどのファイル転送の場合、ファイルが書き込み中である可能性があり、ファイルが大きいなどタイミングによっては途中までしかないファイルで処理してしまうかもしれません。

よくある対策はリネーム

ファイルが途中で切れないようにするためには、ファイルを書き出して終わったらリネームするするほいう方法があります。ファイル書き出し中や転送中は xxx.tmp で作成し終わったら xxx.xml にリネームする方法。相手がプログラムであればこういった工夫はできますが、手作業でファイルをいれる場合などは人間任せになってしまいます。

念のためのリトライ処理

もしファイルが途中でちゃんと読めないことが検出できたら。少しタイマーでまってリトライしてという方法がありますが、本当に壊れたファイルだと永遠に処理が進みません。
じゃあどうするかは次のページへ

ページ: 1 2

 - Linux , , , , ,

  関連記事

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

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

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

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