comando bash timeout mata aleatoriamente antes da duração

1

Estou tentando exibir miniaturas do youtube para um tempo limite específico para o usuário e, em seguida, mostrarei o próximo Eu fiz este comando:

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 )

Mas as imagens são mostradas para o tempo aleatório (cerca de 10s e alguns 1s !!)

Alguém tem alguma idéia do problema?

    
por RYN 08.08.2017 / 22:02

2 respostas

2

Um pipeline de shell executa os programas do pipeline não um após o outro, mas mais ou menos ao mesmo tempo (menos que o sistema se torne cada vez mais ocupado) como é mostrado quando as três primeiras chamadas date são executadas :

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

Portanto, o temporizador timeout já está em contagem regressiva, enquanto wget está ocupado fazendo o download dos dados, mas antes que display tenha tido a chance de exibir os dados.

Uma alternativa seria baixar os dados com antecedência para que haja uma lista de arquivos para exibição para trabalhar; isso removeria os atrasos causados por wget da porção display .

#!/bin/sh
...
get_the_files_here
for f in a_glob_that_matches_the_files_here; do
    timeout 10s display "$f"
done
    
por 08.08.2017 / 22:27
0

Eu acho que o problema é que você e timeout veem diferentes pontos de partida:

Para você, o tempo limite deve começar quando a imagem é exibida. Mas para timeout , começa quando é iniciado.

Existe uma lacuna "aleatória" entre esses dois pontos no tempo: o tempo de download. Você deve atrasar a execução de timeout até o download terminar.

    
por 08.08.2017 / 22:28