Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 监视目录中新文件的bash脚本_Linux_Bash_Inotify_Vbox - Fatal编程技术网

Linux 监视目录中新文件的bash脚本

Linux 监视目录中新文件的bash脚本,linux,bash,inotify,vbox,Linux,Bash,Inotify,Vbox,必须立即注意的是,“监视目录的脚本”有许多变体,我意识到inotify工具将是理想的工具,但是这个特定的脚本用于监视vboxsf文件系统,不幸的是,它不转发文件系统通知。此脚本是一种刷新文件的黑客行为,因此单独运行的守护进程会注意到它 下面的脚本是一个折衷方案。我花了很长时间处理各种问题 正确的findargs 查找路径和 触摸找到的文件的时间 目标是识别新文件,触摸它,使单独运行的守护进程注意到它并随后处理它。问题是,好吧,它吞噬了cpu,大概是从发现开始的。我想帮助你找到一种更有效的方法 虽

必须立即注意的是,“监视目录的脚本”有许多变体,我意识到inotify工具将是理想的工具,但是这个特定的脚本用于监视vboxsf文件系统,不幸的是,它不转发文件系统通知。此脚本是一种刷新文件的黑客行为,因此单独运行的守护进程会注意到它

下面的脚本是一个折衷方案。我花了很长时间处理各种问题

  • 正确的
    find
    args
  • 查找路径和
  • 触摸找到的文件的时间
  • 目标是识别新文件,触摸它,使单独运行的守护进程注意到它并随后处理它。问题是,好吧,它吞噬了cpu,大概是从发现开始的。我想帮助你找到一种更有效的方法

    虽然不是必需的,但要进行全面测试,需要一个挂载的vboxsf文件系统,其中inotifywait的运行方式类似于so
    inotifywait-m/watchs/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
    

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

    因此,
    inotify工具
    可以在主机服务器端使用,对吗

    假设从主机服务器端对新创建的文件进行
    触摸
    无效,对吗

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

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

    否则您的脚本就可以了,但它正在使用轮询。
    因此,在这种情况下,
    睡眠
    可能是强制性的,可能会丢失一些新创建的文件…

    我认为主机端的文件系统类型不是
    vboxsf

    因此,
    inotify工具
    可以在主机服务器端使用,对吗

    假设从主机服务器端对新创建的文件进行
    触摸
    无效,对吗

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

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

    否则您的脚本就可以了,但它正在使用轮询。
    因此,在这种情况下,
    sleep
    可能是强制性的,可能会丢失一些新创建的文件。

    sysdig这样的工具可能会有所帮助。 例如,以下命令显示在/tmp中打开的每个文件:

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

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

    类似于sysdig的工具可能会有所帮助。 例如,以下命令显示在/tmp中打开的每个文件:

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

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

    循环会持续运行,而无需这样做

    find $thedir/* -type f -mmin 0.1
    
    将发现文件在6秒前没有更改(未来也不会超过55秒,但不太可能自然发生)。 假设find在不到一秒钟的时间内运行(除非您有数千个文件),您可能希望在循环中插入sleep5。 另一件事是为什么你把时间放回2分钟在最近更改的文件,你发现。。。当然,2分钟内没有改变的任何东西都处于相同的状态。 如果在文件中标记一个很少使用的属性,例如“no dump”,这样其他恶魔就不会无意中看到那些看起来像被脚本触碰过但没有被触碰过的文件,那么这样做不是更好的选择吗

    与其密集地循环find,不如选择这样做(将touch_me设置为-2min,让其他执事检测):


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

    循环在不需要这样做的情况下持续运行

    find $thedir/* -type f -mmin 0.1
    
    将发现文件在6秒前没有更改(未来也不会超过55秒,但不太可能自然发生)。 假设find在不到一秒钟的时间内运行(除非您有数千个文件),您可能希望在循环中插入sleep5。 另一件事是为什么你把时间放回2分钟在最近更改的文件,你发现。。。当然,2分钟内没有改变的任何东西都处于相同的状态。 如果在文件中标记一个很少使用的属性,例如“no dump”,这样其他恶魔就不会无意中看到那些看起来像被脚本触碰过但没有被触碰过的文件,那么这样做不是更好的选择吗

    与其密集地循环find,不如选择这样做(将touch_me设置为-2min,让其他执事检测):


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

    您希望如何立即得到通知,立即将文件添加到目录中?您没有描述是什么在创建新文件。特别是,你能给它插入一些新的动作/命令吗?我的答案已经更新了,你能看一下吗?你怎么看?对于共享文件夹:
    轮询网络驱动器和VM共享目录(不支持inotify)
    感谢Guard的提示,这看起来正是我所需要的,但在尝试将其安装到CentOS7上后,遇到了各种ruby问题,我不知道如何快速解决。时间已过。您希望如何立即得到通知,立即将文件添加到目录?您没有描述创建新文件的内容。特别是,你能给它插入一些新的动作/命令吗?我的答案已经更新了,你能看一下吗?Wh