wget을 사용하여 스트리밍 mp3를 다운로드하려고 합니다. 이것은 내 기본 명령입니다.
wget http://sj128.hnux.com/sj128.mp3 -c --timeout=1 --waitretry=0 --tries=0 -O "file.mp3"
나는 스크립트에서 이 작업을 수행해 왔지만(1시간 동안 실행), 내 파일이 잘리고 불완전하게 끝나는 것을 발견했습니다. 예를 들어 파일 크기가 30MB 정도 될 것으로 예상했는데 실제 크기는 13MB 정도에 불과했습니다.
CLI에서 직접 이 명령을 실행하고 결국 항상 "읽기 시간 초과"가 발생한다는 사실을 발견하기 전까지는 무슨 일이 일어나고 있는지 이해하지 못했습니다. 이것이 방해가 되어서는 안 됩니다. -c 및 무한 재시도가 이를 훌륭하게 처리해야 합니다.
그러나 대신 "읽기 시간 초과" 및 새로 재시도 후에 다운로드가 계속되더라도 파일 크기가 더 이상 커지지 않습니다.
다운로드는 계속되지만 파일이 예상대로 계속 커지지 않는 이유는 무엇입니까? 모든 출력에 완전히 다른 파일 이름과 새로운 프로세스가 표시되었음에도 불구하고 "파일" 유형 충돌을 피하기 위해 완전히 다른 파일 이름으로 새로운 wget을 시작하는 정교한 스크립트도 만들었습니다. 파일!
이 경우 다운로드가 시작되는 것처럼 보이지만 새 파일이 표시되지 않는 이유는 무엇입니까? ?
답변1
이것은 실시간 스트림입니다. 회복할 시작이나 고정된 위치가 없기 때문에 "회복"이라는 전체 개념이 적용되지 않습니다. 현재 스트리밍 중인 모든 데이터를 얻을 수 있습니다.
그러나 wget
이것을 몰랐습니다. 네트워크 장애 후 복구 시도는 다음과 같습니다.
wget
파일의 크기를 알아보세요. 서버가 재개 가능한 전송을 지원하는 경우wget
소스 파일의 중간부터 전송을 재개해야 하지만 서버에 이 파일이 없고 서버가 재개 가능한 전송을 지원하지 않으므로 이 방법은 실패합니다.- 복원 시도가 실패했으므로
wget
복원을 받은 것으로 간주됩니다.동일한 데이터처음부터. 폐기되는 양이 이전 파일 크기에 도달할 때까지 데이터를 폐기합니다. 그런 다음 파일에 새 데이터를 추가하기 시작합니다. 파일이 커지기 시작하는 시점입니다.
실제로 연결에 문제가 있으면 스트림의 일부를 놓치는 것이 아니라 스트림의 일부를 놓치는 것입니다. 또한 wget
동일한 데이터를 두 번째로 수신했다고 가정하기 때문에 저장할 수 있었던 데이터를 놓칠 수도 있습니다 .
이 문제를 해결하려면 다음을 시작하고 필요에 따라 계속 다시 시작하십시오.
wget http://sj128.hnux.com/sj128.mp3 -O - >> "file.mp3"
(원하시면 다른 옵션도 가능합니다.) 수신된 모든 콘텐츠는 wget
파일에 추가됩니다. 스트림의 일부 세그먼트를 놓친 경우 결과 파일은 분명히 "분쇄된" 콘텐츠를 저장하게 됩니다. 내 테스트에서 VLC는 이러한 파일을 재생하는 데 기술적인 문제가 없었습니다.
참고: 언제든지 .txt 파일을 사용하여 파일을 0 크기로 줄일 수 있습니다 : > file.mp3
. 주어진 파일의 끝을 항상 찾기 wget
때문에 이는 실행 중에도 작동합니다(참조:>>
이것).
wget
"파일" 유형 충돌을 피하기 위해 완전히 다른 파일 이름으로 완전히 새로운 파일을 시작했지만 [...] 여전히 새 파일을 쓰지 않았습니다!
재현할 수 없습니다. 내 것은 wget
새 파일을 썼습니다.
답변2
더 나은 할 일이 없었기 때문에 나는 고용주의 대역폭 중 일부를 게임에 소비하고 있었습니다.
다운로드하려는 파일이 230MiB보다 큽니다. 전원을 끄기 전의 모습입니다.
상대방의 다운로드 속도는 15kbps로 제한되므로 연결이 "불안정한" 경우(보시다시피) 연결이가다감소.
복원을 하려고 했더니 wget
상대측 서버가 복원을 지원하지 않는 것 같아서 wget
그냥 처음으로 돌아가서 다시 시작했습니다.
이는 완전히 예상되는 동작입니다. 특정 조건 하에서 페이지에서 man
가져옵니다 wget
.
Note that -c only works with FTP servers and with HTTP servers that support the
"Range" header.
파일이 커지지 않습니다.
연결이 끊어지는 간격은 (아마도 30,000MiB / 15kBps) = 30분입니다.
wget
연결이 끊어질 때마다 파일의 처음부터 시작해야 합니다. 파일 관리자는 마지막으로 사용된 최대값만 확인하고 해당 크기를 보고하며,wget
처음부터 다시 시작하여 연결이 끊어질 때까지 원본 파일을 단계별로 덮어쓰게 됩니다... 다시... 다시 ......그리고... ...
10초 동안 달리고 wget
멈춘 다음 20초 동안 달리세요. 두 번째 실행에서 다운로드 크기가 이전 크기를 초과하면 파일 크기가 다시 증가하는 것을 볼 수 있습니다.
구체적으로 문서화되어 있지는 않지만 -c
(적어도 찾을 수는 없음) 특정 조건에서 이러한 동작이 예상됩니다. man wget
관련 섹션을 읽어보세요-nc