If you want something done regularily on your Linux machine, there is cron. It's a simple and reliable way to schedule tasks. But sometimes you want to run a job whenever a certain thing happens. If that thing is file related, incron is an excellent solution:
This program is an “inotify cron” system. You can use it a similar way as the regular cron. The difference is that the inotify cron handles filesystem events rather than time periods.
Unfortunately, incron has a limitiation: incron can't monitor directories recursively. That made it pretty useless for the application I had in mind and I started looking for alternatives.
Greggory's orginal Watcher uses YAML files to configure monitoring directories and job setups. There's nothing wrong with YAML, but I'm not a big fan of adding dependencies when there are good enough alternatives in the core already.
Job setup is done in
/etc/watcher.ini. Here is a real life example as I use it on my B3:
; ---------------------- ; General Settings ; ---------------------- [DEFAULT] ; where to store output logfile=/var/log/watcher.log ; where to save the PID file pidfile=/var/run/watcher.pid ; ---------------------- ; Job Setups ; ---------------------- [job1] ; directory or file to watch. Probably should be abs path. watch=/home/storage ; list of events to watch for. ; supported events: ; 'access' - File was accessed (read) (*) ; 'attribute_change' - Metadata changed (permissions, timestamps, extended attributes, etc.) (*) ; 'write_close' - File opened for writing was closed (*) ; 'nowrite_close' - File not opened for writing was closed (*) ; 'create' - File/directory created in watched directory (*) ; 'delete' - File/directory deleted from watched directory (*) ; 'self_delete' - Watched file/directory was itself deleted ; 'modify' - File was modified (*) ; 'self_move' - Watched file/directory was itself moved ; 'move_from' - File moved out of watched directory (*) ; 'move_to' - File moved into watched directory (*) ; 'open' - File was opened (*) ; 'all' - Any of the above events are fired ; 'move' - A combination of 'move_from' and 'move_to' ; 'close' - A combination of 'write_close' and 'nowrite_close' ; ; When monitoring a directory, the events marked with an asterisk (*) above ; can occur for files in the directory, in which case the name field in the ; returned event data identifies the name of the file within the directory. events=create ; if true, watcher will monitor directories recursively for changes recursive=true ; the command to run. Can be any command. It's run as whatever user started watcher. ; The following wildards may be used inside command specification: ; $$ dollar sign ; $watched watched filesystem path (see above) ; $filename event-related file name ; $tflags event flags (textually) ; $nflags event flags (numerically) command=/home/fixperm.sh $filename
The above defines a job to monitor the
/home/storage directory recursively and call
/home/fixperms.sh whenever a new file or directory is created.