Fun with ZFS, httm, and inotifywait

If you've never used inotifywait, it's pretty handy for when you want to snapshot a directory after a file is accessed, or written to, or moved to a watched directory, etc., like so:

inotifywait -r -m --exclude "/srv/downloads/incomplete/" -e moved_to "/srv/downloads/" | while read -r line; do
	sudo /usr/sbin/zfs snapshot rpool/downloads@snap_"$( /bin/date +%F-%T )"_completionSnap
done

However, imagine you're watching a large directory tree where there may be many ZFS datasets, how would you know which dataset to snapshot?

httm has your back!

httm -m <INPUT_FILE> will detect and report back the mount of the ZFS dataset upon which that watched file resides, so you can use that mount/dataset in your snapshot scripts:

inotifywait -r -m --format %w%f --exclude "/srv/downloads/incomplete/" -e moved_to "/srv/downloads/" | while read -r line; do
	filemount="$(httm -m $line)" 
	filedataset="$(mount | grep $filemount | cut -f1 -d' ')" 
	sudo /usr/sbin/zfs snapshot $filedataset@snap_"$( /bin/date +%F-%T )"_completionSnap 
done

If you're comfortable with httm making a few choices for you, httm can also take a snapshot from using just the filename as input:

% sudo httm --snap /var/log/syslog
httm took a snapshot named: rpool/ROOT/ubuntu_wi01vc/var/log@snap_Jun-25-2022-23:11:50_httmSnapFileMount

This last feature is ZFS only for right now.

Available now for 0.12.6 and later editions.