【问题标题】:Making a watched folder wait for a file to finish rendering使监视文件夹等待文件完成渲染
【发布时间】:2015-09-14 19:08:30
【问题描述】:

我正在尝试设置一个监视文件夹(使用 fswatch),它开始使用 ffmpeg 将接收到的文件转换为另一种格式(已整理好该部分)。 到目前为止一切顺利,我遇到的问题是让脚本等到原始输入(或主文件)完成渲染或完全复制到我的监视文件夹中。

这是文件夹的脚本

fswatch -o ~/Desktop/autom_shell| xargs -n1 ~/Desktop/scripts_autom_shell/move_QT.sh

move_QT.sh 过滤并将 quicktime 电影从我的接收文件夹移动到我编码的文件夹。

我已经搜索了解决方案并找到了kqwait,但我完全不知道如何在我的情况下应用它。

MacOS 10.10

【问题讨论】:

    标签: macos shell ffmpeg


    【解决方案1】:

    我查看了 kqwait 的源代码,并阅读了 fswatch 上的文档,尽管名称为 kqwait,但这些实用程序中的大多数都具有相同的基本设计。

    他们等待文件系统中发生操作的通知,这意味着删除、重命名和写入。他们不能真正做的是在应用程序的操作完成时通知您。有一个与“写入”通知相关的通知表明文件已关闭,但大多数这些实用程序的目的不是等待这种情况发生(尽管 kqwait 的名称)。

    大多数这些实用程序旨在等待文件系统上的任何事情发生,过滤以对该文件系统中的特定文件或目录做出反应。只有当您可以等待一系列书面通知的关闭通知时,您才有机会做您想做的事情。即使这样,也不清楚关闭通知是否实际可靠地表明文件的接收已完成。这仅仅意味着写作停止了。在不知道应用程序行为的情况下,这可能意味着连接已断开且文件不完整,并且可能会在后续尝试中恢复。

    您真正需要的是接收比文件系统中发生的事件更高级别事件的通知的能力。

    但除此之外,您可以管理的最好方法是响应 fswatch(或类似命令),这表明写入已开始,然后监视您确定为感兴趣的传入文件的任何新文件,随着时间的推移看看它们是否继续增长(或者您继续从 fswatch 收到关于写作仍在继续的通知)。然后,在脚本观察到文件大小不再增长的足够时间之后,或者在 fswatch 不再通知写入发生的情况下经过足够的时间之后,您可以假设文件已完成并尝试启动转换。

    这不仅仅是对示例帖子的更正 - 它正在编写一个复杂性有限的脚本,选择多种设计途径中的任何一种,所有这些都是基于不清楚的假设(在假设接收之前应该经过多少时间是完成,例如)。

    【讨论】:

    • "在不知道应用程序行为的情况下,这可能意味着连接已断开且文件不完整,并且可能会在后续尝试中恢复。"基本上,CPU 使用率达到顶峰。如果应用程序闲置或忙于编辑任务(Avid Media Composer 或 Final Cut),则 CPU 负载在任何规模上都在 1.5 到 15 之间,而在渲染时它可能会上升到 1.500。我使用 ps -xco %cpu,command | 得到了这个数字grep AvidMediaComposer 这是我在 Applescript 中找到的代码示例
    • 抱歉,新来的,格式有问题。 ps -xco %cpu,command | grep AvidMediaComposer
    【解决方案2】:

    回答我自己的问题:

    我尝试了一些方法,并出于各种原因考虑了检查 CPU 负载的想法。 我正在使用以下代码

    prev_size=-1 # initialize variable
    new_size=`/usr/bin/du -sk "$file_i" | awk '{print $1}'` # get current file size
    
    while [ $prev_size != $new_size ] # repeat until these values are the same
    do
    /bin/sleep 5 # check every 5 seconds
    tmp_size=$new_size # move to intermediate value
    new_size=`/usr/bin/du -sk "$file_i" | awk '{print $1}'` # get new file size
    prev_size=$tmp_size
    done
    

    我找到了here,这取决于目录大小。 虽然它并不完美,但对于我的目的来说已经足够了。 希望我有更多的时间来处理这个问题,完成后会将代码发布到我的脚本中。

    【讨论】:

      【解决方案3】:
      fswatch -xn /Users/...... | while read file; do
       while [ `lsof -t $file` > 0 ]; do sleep .1; done
        ffmpeg........
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-07
        • 1970-01-01
        相关资源
        最近更新 更多