Bash while 循环等待任务完成

Posted

技术标签:

【中文标题】Bash while 循环等待任务完成【英文标题】:Bash while loop wait until task has completed 【发布时间】:2012-12-09 08:42:34 【问题描述】:

我创建了一个 bash 脚本,用于处理文件夹及其子文件夹中的视频:

find . -type f -name '*.mkv' | while read file;
do
  ffmpeg -i $file ...
done

问题:不是等待 ffmpeg 完成的 while 循环,而是继续遍历循环。最终结果是,文件没有得到处理。我需要一种方法让当前的 while 循环迭代等到 ffmpeg 完成后再继续下一个。或者另一种方式来排队这些项目。

编辑:所以迭代一组文件时的解决方案是将 -nostdin 参数传递给 ffmpeg。希望这对可能遇到类似问题的其他人有所帮助。

还有文件 --> $file 是复制/粘贴错字。

【问题讨论】:

也许在ffmpeg 命令末尾使用& 将进程粘贴在后台? 你所拥有的应该等待 ffmpeg 完成。您确定您没有收到来自 ffmpeg 的错误(例如无效参数)吗? 您拥有的循环应该等到每个内部命令运行,除非您在行尾放置了&。您收到任何错误消息吗?尝试在内部命令前加上“echo”并在其后添加 sleep 1,以验证循环本身没有问题。例如,在您提供的命令行中,您使用的是file 而不是$file -nostdin 选项添加到ffmpeg 有帮助吗?它可能正在读取 while 循环的所有其余输入。 谢谢巴马尔。成功了! 【参考方案1】:

我意识到我不久前发布了这个,但我找到了解决方案。感谢所有的回复。将 -nostdin 参数提供给 ffmpeg 就可以了。在移动到下一个文件进行处理之前,它将只处理当前文件。

ffmpeg 的 -nostdin 选项可避免尝试从标准输入读取用户输入,否则会解释视频文件本身。

ffmpeg -i <filename> ... -nostdin

使用上面的最好的部分是你可以继续使用详细程度,以防输出中抛出错误:

ffmpeg -i <filename> ... -nostdin -loglevel panic 

或者,如果您希望将输出报告到文件中,请这样做:

# Custom log name (optional). Helpful when multiple files are involved.
# FFREPORT=./$filename-$(date +%h.%m.%s).log
ffmpeg -i <filename> ... -nostdin -report

您也可以将两者结合使用。还要感谢@Barmar 的解决方案!

【讨论】:

【参考方案2】:

我是一个恶毒的答案抢夺者。我找到了一个:

ffmpeg -i $file &
wait $!

感谢 puchu,这里:apply ffmpeg to many files

【讨论】:

这是一个有趣的方法,我必须尝试一下。谢谢!我发现提供 ffmpeg 参数 -nostdin 可以解决问题。【参考方案3】:

这对你有好处吗?

find . -type f -name '*.mkv' -exec ffmpeg -i  \;

【讨论】:

【参考方案4】:

我认为这就像您在file 之前缺少$ 一样简单。

find . -type f -name '*.mkv' | while read file;
do
    ffmpeg -i $file ...
done

【讨论】:

以上是关于Bash while 循环等待任务完成的主要内容,如果未能解决你的问题,请参考以下文章

如何使用定时全局变量影响 bash while 循环?

MPI - 跨进程共享队列

为啥我的循环中的异步委托没有等待

Executorservice 等待任务完成后

等待函数完成,直到回调到来

如何等待 requestLocationUpdates() 回调意图完成?