我是脚本编写新手,我制作了一个读取 2 个文件并执行命令并输出日志文件的脚本。
我希望这个脚本像守护进程一样运行,并等待这两个文件中的更改,以便在这些文件上再次执行这些命令。
我知道使用了一些 inotify,但我不知道如何使用它以及在哪里放置循环,以便脚本也能按我想要的方式工作,即:
- 用户第一次执行脚本
- 该脚本读取这些文件并生成输出日志
- 脚本“睡眠”(守护进程)直到这两个日志文件发生更改(添加了一些行)
- 对这些文件再次执行相同的脚本
- 再次睡眠并等待这2个文件的变化
答案1
我必须监控一个旧软件,它没有足够的日志记录选项。这并不完全是您想要的,但可能会对您有所帮助。
- 每秒比较 2 个文件 (
ref.cfg
和)cur.cfg
cfg.log
如果检测到差异则记录到文件- 如果检测到更改,则对文件进行比较
- 备份带有日期后缀的文件
watch_cfg.sh
:
#!/bin/bash
cfg_reference="/tmp/ref.cfg"
cfg_current="/tmp/cur.cfg"
while true;
do
cfg1=$(cat $cfg_reference)
cfg2=$(cat $cfg_current)
date_current="$(date +"%F_%T")"
diff_detected=false
test "$cfg1" = "$cfg2" || diff_detected=true
if [ "$diff_detected" = true ]; then
printf "$date_current [cfg] diff detected\n" >> cfg.log
diff $cfg_reference $ecfg_current > "./cfg_diff/cur.cfg_${date_current}"
cp -a "$cfg_reference" "./cfg_old/cur.cfg_before_${date_current}"
cp -a "$cfg_current" "$cfg_reference"
fi
sleep 1
done
运行这些命令:
chmod +x watch_cfg.sh
nohup ./watch_cfg.sh > /dev/null 2>&1 &
这会将进程与当前会话分离并将其发送到后台。
答案2
我认为这可能对您有帮助,所以我将其作为“答案”发布(如果我可以发表评论,我会这样做)。
http://www.nongnu.org/fileschanged/
示例 4 可能属于您想要做的事情。我很早以前就用过它,效果很好。
./fileschanged -r dir | while read file ; do
if [ "${file}" == "x" ] ; then
handle_file_x_script "${file}"
else if [ "${file}" == "y" ] ; then
handle_file_y_script "${file}"
fi
done
答案3
你可以使用incron
监听 inotify 事件。软件包可以在类似 debian(ubuntu,...)的发行版中使用,也可能在其他发行版中使用