fswatcher – a platform-agnostic inotifywait

fswatcher is a small utility I have written to have a program that runs a given command when a file or a directory is modified and that will work on both OS X and Linux. (It should also work on Windows, but I haven’t tested.)

I have just uploaded it to Hackage, so it should be possible to install with cabal install fswatcher.

It is really simple and really just a thin wrapper on top of the fsnotify library. It takes two arguments: a file/directory to watch, and a command to run on changes:

$ fswatcher report.md pandoc report.md -o report.pdf
Started to watch report.md [→ /private/tmp/report.md]
Running pandoc report.md -o report.pdf...
Process completed successfully
Running pandoc report.md -o report.pdf...
Process completed successfully
^C
Stopping.

It’s quite simple and uses a separate thread to run the provided command whenever an MVar “trigger” is filled. This MVar contains nothing or a unit (()), and the thread listening for events uses tryPutMVar to avoid re-running long-running commands for every change. Since tryPutMVar will succeed only once per command invocation, the command will only be re-run once if several changes happened while it was running.

The code is short and simple and available on github.