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처음 세 호출이 실행될 때 아래와 같이 프로그램을 거의 동시에 실행합니다(시스템이 더 복잡해지면 실행 시간이 줄어듭니다).

$ 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다운로드가 완료될 때까지 실행을 지연해야 합니다 .

관련 정보