bash timeout コマンドは、持続時間の前にランダムに終了します。

bash timeout コマンドは、持続時間の前にランダムに終了します。

ユーザーに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

パイプラインでプログラムを順番に実行するのではなく、シェルパイプラインはdate最初の3つの呼び出しが実行されたときに以下のようにプログラムをほぼ同時に実行します(システムがより複雑になると実行時間が短くなります)。

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

したがって、タイマーはtimeoutデータのダウンロード中にそのデータを表示する前にすでにカウントダウンしています。wgetdisplay

1つの回避策は、表示するファイルのリストがあるように事前にデータをダウンロードすることです。これにより、wgetその部分による遅延がなくなりますdisplay

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

おすすめ記事