Monitor your filesystem events on Linux with inotify

Inotify provides a nifty C API to monitor files and directories. The API hooks into your kernel and responding to events on your filesystem is much more efficient than doing something like writing a cron job to check for changes in a directory every minute. Fortunately, if you’re not a C developer, there is a package called inotify-tools that comes with two programs, inotifywait and inotifywatch. The difference is inotifywait waits for changes and inotifywatch gathers filesystem access statistics.

Here is an example of using inotifywait to keep two directories synced:

#!/bin/sh
# Example: inotifywait
# Description: This example keeps the directory "/put-here" in sync with "/watch-here" when changes are made to anything in "/watch-here"
# Author: Richard Sumilang <me@richardsumilang.com>
#
$watch_dir=/watch-here
$put_dir=/put-here

inotifywait -mr -e modify,attrib,moved_to,moved_from,move,move_self,create,delete,delete_self $watch_dir |
while read dir ev file;
do
	if [[ $ev == "DELETE"  ]]; then
		rm -rf $put_dir$file
	elif [[ $file != *~ ]] || [[ $file != *swp ]] || [[ $file != *swx ]]; then
		rsync -azvhp --delete --exclude '.idea' --exclude '.svn' --exclude '.vagrant' --exclude 'tmp' --exclude 'crowdfusion' --exclude 'system' "$watch_dir$file" "$put_dir$file"
	fi
done;

What if I’m monitoring a network mount?

There are a few gotchas here. If you are monitoring a network mount then you will NOT receive notifications if files are edited on the remote machine. This is simply because the kernel has no knowledge of this. A solution would be to run another process on the host machine that can send a notification. However, it should work if you modify files in the mount from the machine running inotify.

Jul 14, 2014 Unix-like