如何使脚本像守护进程一样运行,等待 2 个文件中的更改?

如何使脚本像守护进程一样运行,等待 2 个文件中的更改?

我是脚本编写新手,我制作了一个读取 2 个文件并执行命令并输出日志文件的脚本。

我希望这个脚本像守护进程一样运行,并等待这两个文件中的更改,以便在这些文件上再次执行这些命令。

我知道使用了一些 inotify,但我不知道如何使用它以及在哪里放置循环,以便脚本也能按我想要的方式工作,即:

  1. 用户第一次执行脚本
  2. 该脚本读取这些文件并生成输出日志
  3. 脚本“睡眠”(守护进程)直到这两个日志文件发生更改(添加了一些行)
  4. 对这些文件再次执行相同的脚本
  5. 再次睡眠并等待这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,...)的发行版中使用,也可能在其他发行版中使用

相关内容