wget은 실제 빈 파일을 가져옵니다.

wget은 실제 빈 파일을 가져옵니다.

원격 서버에서 특정 수의 파일을 다운로드하도록 설계된 스크립트가 있습니다. 내 서버에 있는 데이터베이스의 JSON 소스이므로 24시간마다 한 번만 이 작업을 수행하면 됩니다. 파일은 GMT 자정쯤에 원격 서버에서 업데이트되고 내 스크립트는 그로부터 한 시간 후에 실행되어 파일이 올바르게 업데이트되었는지 확인합니다.

문제는 132개의 파일 중 적어도 20개 이상의 파일을 다운로드하는데 실패하는 것을 계속해서 눈치채는데 전혀 실패하지 않는다고 생각한다는 것입니다(200 OK로 보입니다). JSON이므로 크기는 최대 8KB입니다. wget 로그 파일에 다음이 표시됩니다.

--2013-09-21 12:01:10--  http://services.runescape.com/m=itemdb_rs/api/graph/19227.json
Reusing existing connection to services.runescape.com:80.
HTTP request sent, awaiting response... 200 OK
Length: 0 [text/html]
Saving to: `./jsons/19227.json'

 0K                                                        0.00 =0s

2013-09-21 12:01:10 (0.00 B/s) - `./jsons/19227.json' saved [0/0]

이것은 말이 되지 않습니다. 실패에는 운율이나 이유가 없습니다. 나는 여러 번 재시도했고 매번 같은 파일에 실패하는 대신 무작위로 0바이트 파일에 썼습니다. 아쉽게도 어디에도 오류가 없어서 오류 로그에 아무 것도 기록되지 않습니다...

이 경우 비파괴는 중요하지 않습니다. 이러한 파일은 24시간마다 오래된 파일이 되기 때문에 덮어쓰기되며, 전날의 "좋은 데이터"라도 오늘은 "나쁜 데이터"가 됩니다.

다운로드하기 전에 파일 크기 등을 확인하기 위해 스크립트를 개선할 수 있는 곳이 있습니까? 집에 있는 Mac에서 시도해 보았지만 "스파이더 모드"를 사용하여 먼저 Mac에 있는지 확인했지만 동일한 결과를 얻었습니다. 가장 실망스러운 부분은 URL을 브라우저에 붙여넣으면 전체 JSON이 로드된다는 것입니다. 어쨌든 wget에서는 HTTP 오류가 발생하지 않기 때문에 "재시도"가 도움이 되지 않을 것 같습니다.

답변1

wget디버그 스위치를 켜서 -d무슨 일이 일어나고 있는지 확인해 볼 수도 있습니다.

$ wget -d http://services.runescape.com/m=itemdb_rs/api/graph/19227.json
DEBUG output created by Wget 1.12 on linux-gnu.

--2013-09-21 13:22:46--  http://services.runescape.com/m=itemdb_rs/api/graph/19227.json
Resolving services.runescape.com... 216.115.77.143, 8.26.16.145, 62.67.0.145, ...
Caching services.runescape.com => 216.115.77.143 8.26.16.145 62.67.0.145 64.94.237.145
Connecting to services.runescape.com|216.115.77.143|:80... connected.
Created socket 3.
Releasing 0x0000000000f251e0 (new refcount 1).

---request begin---
GET /m=itemdb_rs/api/graph/19227.json HTTP/1.0
Referer: http://www.google.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Host: services.runescape.com
Connection: Keep-Alive
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300

---request end---
HTTP request sent, awaiting response... 
---response begin---
HTTP/1.1 200 OK
Date: Sat, 21-Sep-2013 17:22:47 GMT
Server: JAGeX/3.1
Content-type: text/html; charset=ISO-8859-1
Content-Encoding: gzip
Cache-control: no-cache
Pragma: no-cache
Expires: Thu, 01-Jan-1970 00:00:00 GMT
Set-Cookie: settings=wwGlrZHF5gKN6D3mDdihco3oPeYN2KFybL9hUUFqOvk; version=1; path=/; domain=.runescape.com; Expires=Tue, 20-Sep-2016 17:22:47 GMT; Max-Age=94608000
Connection: Keep-alive
Content-length: 1668

---response end---
200 OK
cdm: 1 2 3 4 5 6 7 8
Stored cookie runescape.com -1 (ANY) / <permanent> <insecure> [expiry 2016-09-20 13:22:47] settings wwGlrZHF5gKN6D3mDdihco3oPeYN2KFybL9hUUFqOvk
Registered socket 3 for persistent reuse.
Length: 1668 (1.6K) [text/html]
Saving to: “19227.json”

100%[==============================================================================================================================>] 1,668       --.-K/s   in 0.08s   

2013-09-21 13:22:47 (21.4 KB/s) - “19227.json” saved [1668/1668]

답변2

다운로드하기 전에 파일 크기 등을 확인하기 위해 스크립트를 개선할 수 있는 곳이 있습니까?

앞으로분명히 서버가 다운로드 요청에 제대로 응답할 수 없기 때문에 다운로드할 필요가 없습니다. 올바른 파일을 반환하거나 HTTP 오류 코드를 반환해야 하지만 분명히 둘 중 하나도 반환하지 않습니다. HTTP 요청을 사용하여 원격 파일 크기를 확인할 수 있지만 HEAD원격 파일은 정상이지만 전송이 여전히 실패하는 경우 아무 소용이 없습니다.GET

대신 스크립트에서 루프를 사용하여 다운로드하려는 모든 파일을 반복하십시오. 단일 wget요청으로 각 파일을 다운로드한 후 다운로드한 파일의 파일 크기를 확인하세요. 0바이트 파일이고 0바이트 파일이 아니어야 한다고 확신하는 경우 요청을 반복하십시오. 물론 스크립트가 항상 실패하고 잠재적으로 지연되는 요청을 끝없이 반복하지 않도록 안전 장치 제한을 추가해야 합니다(서버가 요청 속도를 제한하고 의도적으로 실패하게 만드는 경우).

답변3

대상 디렉터리에서 빈 파일을 삭제합니다. 이것이 제가하는 것입니다.

wget -c -t 40 -O /path/to/dir/myfile1 wget
-c -t 40 -O /path/to/dir/myfile2

/path/to/dir 찾기 -empty -type f -delete

...빈 myfile이 모두 사라졌습니다.

관련 정보