John Robertson
Posted on September 8, 2020
Bash is very useful when it comes to automating system administration tasks. Sometimes you need to take action based on external events, and there aren't a lot of examples of how this can be done. It's pretty straightforward:
#!/bin/bash -eu
# Launch inotifywait monitoring the syslog in a subprocess.
# Redirect stdout of subshell to pipe #3
exec 3< <(exec inotifywait -m /var/log/syslog)
# Read each line of output from inotifywait
while read -u 3 FILE OPS; do
# stdin, stdout, stderr all available in loop
echo "FILE= '$FILE', OPS= '$OPS'"
# OPS are comma separated. Swap comma for space, deal with each individually.
for op in ${OPS//,/ }; do
# Branch on $op
case $op in
MODIFY)
echo "$FILE was modified.";;
ACCESS)
echo "$FILE was accessed.";;
CLOSE_NOWRITE)
echo "$FILE was closed without changes."
break 2;;
# Other actions go here
esac
done
done
# Close pipe
exec 3<&-
# Only get here on loop exit, or if inotifywait quits.
exit 0
To exercise the script, try running it and then pulling up your syslog in a pager. When you exit the pager, your script should exit as well.
This and other examples are available on Github.
I'll be happy to try and answer any questions.
๐ ๐ช ๐
๐ฉ
John Robertson
Posted on September 8, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
bash Day 5/90: Advanced Shell Scripting for DevOps Engineers ๐ ๏ธ #90DaysOfDevOps
October 23, 2024