监视新文件目录的bash脚本

时间:2016-05-13 05:51:52

标签: linux bash inotify vbox

重要的是要立即注意,观看目录的脚本有很多种变化'我意识到inotify-tools是理想的,但是这个特定的脚本用于监视vboxsf文件系统,遗憾的是它不会转发文件系统通知。这个脚本是一个刷新文件的黑客,所以一个单独的运行守护进程会注意到它。

以下脚本是妥协。我花了很长时间处理各种问题

  1. 正确的find args
  2. find路径和
  3. 触摸找到的文件的时间。
  4. 目标是识别新文件,触摸它以使单独的运行守护程序注意到它并随后对其进行处理。问题是,它吞噬了cpu并且可能来自发现。我希望找到一种更有效的方法来帮助我。

    虽然不是必需的,但要完全测试,需要一个已安装的vboxsf文件系统,其中inotifywait运行如此inotifywait -m /watches/watchdir -e attrib

    主机端的文件创建不会在客户端产生ATTRIB通知,直到文件以某种方式刷新 - 在这种情况下,此黑客使用' touch'

    thedir=/watches/watchdir
    
    touch_me() {
        if [ "${newbie}" ]; then
     #  echo "got this: ${newbie}"
        touch -d '-120 seconds' "${newbie}"
        fi
    }
    
    while true
    do
        newbie=`find $thedir/* -type f -mmin 0.1 2>/dev/null`
        touch_me
    done
    

3 个答案:

答案 0 :(得分:0)

我相信主机端的文件系统类型不是vboxsf

因此,inotify-tools可以在主机服务器端使用,对吧?

假设主机服务器端新创建的文件上的touch没有效果,那么?

在主机服务器端创建新文件时,inotify-tools可以使用VBoXManage对来宾执行touch命令,例如:

$ VBoxManage guestcontrol execute vmname /usr/bin/touch --username root --password 'changeme' --arguments "-d '-120 seconds' /watches/watchdir/${newbie}"

您怎么看?

否则你的脚本没问题,但它正在使用轮询。 因此,在这种情况下,sleep可能是强制性的,可能会错过一些新创建的文件......

答案 1 :(得分:0)

sysdig 这样的工具可能会有所帮助。 例如,以下命令显示在/ tmp:

中打开的每个文件
sysdig evt.type=open and fd.name contains /tmp

此工具非常复杂但功能强大,通过阅读其手册,您可以找到解决问题的有效方法。

答案 2 :(得分:0)

循环不断运行而不需要这样做

find $thedir/* -type f -mmin 0.1

将在6秒前发现文件不再发生变化(未来不会超过55秒,但不太可能自然发生)。 假设find运行的时间少于一秒(除非你有数千个文件),你可能想在循环中插入一个sleep 5。 另一件事是你为什么要把时间花在2分钟后才能找到你发现的最近更改的文件...当然,任何在2分钟内没有改变的东西都处于相同的状态。 是不是更好的选择,用一个很少使用的属性来标记文件,比如'no dump',这样另一个恶魔就不会无意中看到那些看起来像是被脚本触及但是没有的文件?

而不是使用find进行密集循环,可以选择执行类似这样的操作(将touch_me留给-2min,以便其他守护进程检测):

touch_me() {
  #  echo "got this: $1"
  touch -d '-120 seconds' $1
}

touch /tmp/file.ref
while true
do
  for FILE in $thedir/*
  do
    [ $FILE -nt /tmp/file.ref ] && touch_me $FILE
  done
  touch /tmp/file.ref
  sleep 60
done

这样,while的每次迭代都会查找在上一次迭代后修改过的文件。