【问题标题】:Shell Script: kill program after set time if output file is emptyShell脚本:如果输出文件为空,则在设定时间后终止程序
【发布时间】:2014-04-30 10:40:36
【问题描述】:

我正在终端内运行一个命令,该命令通过一个目录检查媒体文件,然后从这些文件中提取隐藏式字幕数据。不幸的是,即使不存在隐藏式字幕数据,程序仍会处理整个文件,这可能需要很长时间。我想做的是在 60 秒后检查输出并查找数据,如果文件为空,则终止进程并转到下一个文件。

我的旧命令如下

for i in */*.vob
do
     /home/me/ccextractor/linux/ccextractor -out=srt -utf8 -trim "$i"
done

我一直在尝试使用sleep,但我似乎无法让它工作。有什么建议吗?


解决方案

在以下答案的帮助下(也请注意 cmets),我的最终工作代码是:

for i in */*.vob
do
    /home/me/ccextractor/linux/ccextractor -out=srt -utf8 -trim "$i" &
    pid=$!
    sleep 15
    srtfile=$(expr "${i}" | sed -r 's/.{4}$//')
    fgrep -q "1" "${srtfile}.srt" || kill $pid
    wait $pid
done

【问题讨论】:

  • 也许寻找timeout 而不是sleep,请参阅this。此外,考虑将您的单行代码重写为常规 bash 脚本,以提高问题的可读性。
  • 感谢 BroSlow 的建议。我还更新了格式以帮助其他人在未来阅读问题和解决方案。

标签: bash shell command-line terminal


【解决方案1】:

假设ccextractor 在后台运行良好(不需要输入或tty),然后尝试:

for i in */*.vob
do
    /home/me/ccextractor/linux/ccextractor -out=srt -utf8 -trim "$i" &
    pid=$!
    sleep 60
    [ -s "${i}_1" ] || kill $pid
    wait $pid
done

我还假设ccextractor 创建的输出文件在输入文件的名称后面附加了_1

[ -s "${i}_1" ] 测试输出文件是否存在并且大小是否大于零。如果为假,则运行“或”条件并终止进程。

wait $pid 导致 shell 等待一个 ccextractor 退出,然后再启动另一个。如果要并行运行,请删除此行。

【讨论】:

  • 这帮了大忙!太感谢了。由于某种原因,我无法让-s 工作,因此我将其切换并使用fgrep 来搜索在填充文件时会出现的已知字符。由于 ccextractor 程序用新的扩展替换了现有的扩展,因此我还需要做一些工作来为fgrep(或-s)提供正确的文件路径。
【解决方案2】:

处理一分钟的视频后可以让CCExtractor退出,不需要杀死进程或单独控制。

ccextractor -endat 1:00 [etc]

会做你想做的。

【讨论】:

  • 感谢您的意见!问题是,如果提取了字幕数据,我不希望 ccextractor 退出。我只希望它在处理文件时退出,即使没有任何字幕数据存在。这就是为什么我需要在一定时间后检查 srt 文件是否为空。如果它不为空,我让它继续直到文件完成。
  • jeffers.R 你可以在第一分钟处理,检查生成文件的大小,如果它不是零,则完全处理文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2013-10-06
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
相关资源
最近更新 更多