The problem#
I was running a Factorio multiplayer server and was being paranoid about making sure I didn't lose any save data. But I also didn't want to put the saves directory on my ZFS file system as it's on a hard drive, not an SSD, and saves taking too long can cause lag for the players (although with non-blocking saving this is much less of an issue).
The solution#
The following script watches the saves/
directory for any new
files being written and immediately copies them to the ZFS dataset
tank/factorio
mounted at /tank/factorio/
and creates a snapshot
named with the current date and time. The result is a snapshot
corresponding to every time the game saved with the save data.
#!/bin/sh
while true
do
inotifywait -r saves/ -e close_write
sleep 0.1s # write is to *.tmp.zip, wait for rename
rsync -avhx saves/ /tank/factorio/
now="$(date +%Y-%m-%d_%H-%M-%S)"
zfs snapshot tank/factorio@save-"$now"
done