2016-05-13 50 views
1

立即注意到'脚本观看目录'有许多变化很重要我意识到inotify-tools会是理想的,但是这个特定的脚本正在用来监视vboxsf文件系统不幸的是不会转发文件系统通知。这个脚本是刷新文件的一种手段,因此单独运行的守护程序会注意到它。观看新文件目录的bash脚本

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

  1. 正确find ARGS
  2. find路径和
  3. 用于接触找到的文件的时间。

目的是识别新文件,触摸它,以便单独运行的守护进程注意到它并随后处理它。问题在于,它消耗了CPU并推测来自发现。我希望能帮助您找到更有效的方法。

虽然不是必要的,但要充分测试,一个需要用inotifywait运行就像在主机侧,inotifywait -m /watches/watchdir -e attrib

文件创建不会导致客户机侧的ATTRIB通知,直到该文件已安装vboxsf文件系统不知何故被刷新 - 在这种情况下,这个黑客使用“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 
+0

如何立即获得现在文件添加到目录的通知? –

+0

你没有描述什么是创建新文件。特别是,你可以插入一些新的动作/命令吗? –

+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就是在这样的情况下强制性的,与错过一些新创建的文件的风险...

+0

这是最适合我的工作。我已将解决方案更改为以下内容: 'theuser = transmission thepass =“thepassword” /usr/bin/inotifywait -q -m $ thedir -e create -e moved_to |同时读取路径动作文件;做 #echo“文件'$ file'通过'$ action'出现在'$ path'目录中' #echo”$ {file} $ {file}“ /usr/bin/VBoxManage guestcontrol $ thevm运行--exe/usr/bin/touch --username root --password $ thepass - -c“$ {path} $ {file}” done' – zeek

+0

super!在我的身边,你让我发现了'inotify-tools'; thx! 你愿意接受这个答案是最好的吗? –

0

sysdig工具可能会有所帮助。 例如,下面的命令显示所有文件打开出现这种情况在/ tmp目录:

sysdig evt.type=open and fd.name contains /tmp 

这个工具非常复杂且功能强大,并通过阅读其说明书,会发现你的问题的一个有效的解决方案。

+0

OP的问题不是捕捉事件,而是在主机和客户机之间传播它们。 –

0

循环不断运行,而不需要这么做

find $thedir/* -type f -mmin 0.1 

会发现改变的文件不超过6秒前(和未来没有更多然后55秒但不太可能自然发生)。 假设在一秒钟内找到运行(除非您有数千个文件),您可能希望在循环中插入睡眠5。 另一件事是为什么你把时间放回最近更改的文件上2分钟,你发现......当然,任何2分钟内没有改变的东西都处于相同的状态。 如果用一个很少使用的属性(如'no dump')来标记文件不是更好的选择,那么另一个恶魔不会无意中在看起来像被脚本触摸但不是它的文件上?

而是然后查找集中循环这将是做这样的事情(离开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 

这样的每一次迭代同时将查找上一次迭代后修改的文件。

+0

这是一个好主意,但是问题的难点在于我希望在创建文件时尽可能快地完成处理。 6秒是可以接受的,但超过10个是不希望的。如果touch和-nt可以在60秒内使用,这可能会工作,但不幸的是他们测试> 60。 – zeek

+0

好了,然后用sleep 6替换睡眠60,并执行chattr的事情而不是-2分钟...你应该会死的... 可能希望守护进程将属性恢复正常以防止它再次脱离文件。 – louigi600

相关问题