Haskellでファイルの変更を監視
別プログラムがファイルにデータの書き出しを行うのを監視する必要があったため.
hinotifyというinotify APIのHaskell向けバインディングを使います.
非Linux環境? 何もわからない.
import Control.Concurrent
import System.INotify
main :: IO ()
main = do
inotify <- initINotify
watchDescriptor <- addWatch inotify [AllEvents] "foo.txt"
(\e -> threadDelay (10 * 1000 * 1000) >> print e)
print watchDescriptor
_ <- getLine
return ()
イベントリスナーは永続ですがメインスレッドが終了してしまうと何もかも終わるためgetLine
などの適切な関数で実行を待つ必要があります.
処理を実行中にまたファイルの変更があったらどうなるのか,
ファイルの処理中にまたファイルの変更があったことを想定して気になったのでthreadDelay
して調べてみたのですが,
ファイルの処理中にファイルが変更されてもちゃんと2回イベントリスナーは実行されるみたいですね.
inotifyはinotify-toolsを使ってshellを抜ける形式で
while true; do; inotifywait -e modify *.md && markdown2article アルゴリズムとデータ構造2-テストノート.md; done
のようにしか扱ったことが無かったため, 2重変更で2回呼び出されるのか知りませんでした.