bash 超时命令在持续时间之前随机杀死

bash 超时命令在持续时间之前随机杀死

我正在尝试向用户显示来自 youtube 的特定超时缩略图,然后显示下一个我执行了以下命令:

while read line; do\
      wget -O- -q "$line" | \
      timeout 10s display ;\
done < <(youtube-dl --get-thumbnail https://www.youtube.com/watch?v=jPBdQRkWvGY https://www.youtube.com/watch?v=ybLXm5LOSks https://www.youtube.com/watch?v=9fr3ECCSo6U https://www.youtube.com/watch?v=EKST1uliDU8 )

但图像显示的时间是随机的(有些是 10 秒,有些是 1 秒!!)

有谁知道他们有什么问题吗?

答案1

shell 管道不是一个接一个地执行管道中的程序,而是或多或少同时执行(随着系统变得越来越繁忙,执行时间会减少),如以下前三个调用date执行时所示:

$ date +%s; (date +%s >&2; sleep 3) | (date +%s >&2; sleep 5); date +%s
1502224035
1502224035
1502224035
1502224040
$ 

因此,计时器在忙于下载数据但有机会显示所述数据之前timeout已经开始倒计时。wgetdisplay

一种解决方法是提前下载数据,以便有一个可供显示的文件列表;这将消除wget该部分造成的延迟display

#!/bin/sh
...
get_the_files_here
for f in a_glob_that_matches_the_files_here; do
    timeout 10s display "$f"
done

答案2

我想问题在于你timeout看到了不同的起点:

对于您来说,超时应该在图像显示时开始。但因为timeout它从开始时就开始了。

这两个时间点之间存在一个“随机”间隙:下载时间。您必须延迟执行,timeout直到下载完成。

相关内容