• 作成:

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回呼び出されるのか知りませんでした.