Processing data with inotify-tools as a daemon
-
07-06-2021 - |
Question
I have a bash script that processes some data using inotify-tools to know when certain events took place on the filesystem. It works fine if run in the bash console, but when I try to run it as a daemon it fails. I think the reason is the fact that all the output from the inotifywait
command call goes to a file, thus, the part after | while
doesn't get called anymore. How can I fix that? Here is my script.
#!/bin/bash
inotifywait -d -r \
-o /dev/null \
-e close_write \
--exclude "^[\.+]|cgi-bin|recycle_bin" \
--format "%w:%&e:%f" \
$1|
while IFS=':' read directory event file
do
#doing my thing
done
So, -d
tells inotifywait
to run as daemon, -r
to do it recursively and -o
is the file in which to save the output. In my case the file is /dev/null
because I don't really need the output except for processing the part after the command (| while...
)
La solution
You don't want to run inotify-wait
as a daemon in this case, because you want to continue process output from the command. You want to replace the -d
command line option with -m
, which tells inotifywait
to keep monitoring the files and continue printing to stdout
:
-m, --monitor
Instead of exiting after receiving a single event, execute
indefinitely. The default behaviour is to exit after the
first event occurs.
If you want things running in the background, you'll need to background the entire script.
Autres conseils
Here's a solution using nohup: (Note in my testing, if I specified the -o the while loop didn't seem to be evaluated)
nohup inotifywait -m -r \
-e close_write \
--exclude "^[\.+]|cgi-bin|recycle_bin" \
--format "%w:%&e:%f" \
$1 |
while IFS=':' read directory event file
do
#doing my thing
done >> /some/path/to/log 2>&1 &