Wget filettato: risorse minimizzanti
Domanda
Ho uno script che sta ottenendo le posizioni GeoIP di vari ips, questo viene eseguito quotidianamente e mi aspetto di avere circa 50.000 ips da cercare.
Ho impostato un sistema GeoIP - Vorrei solo eliminare wget 50.000 volte per report.
Quello che stavo pensando è che ci deve essere un modo per fare in modo che wget apra una connessione con l'URL, quindi passa l'ip, in questo modo non deve ristabilire la connessione.
Qualsiasi aiuto sarà molto apprezzato.
Soluzione
Se dai wget
più indirizzi contemporaneamente, con indirizzi consecutivi appartenenti allo stesso HTTP / 1.1 ( Connection: keep-alive
) server di supporto, wget
riutilizzerà la connessione già stabilita.
Se ci sono troppi indirizzi da elencare sulla riga di comando, puoi scriverli in un file e usare l'opzione -i
/ --input-file =
(e, secondo la tradizione UNIX, -i-
/ --input-file = -
legge l'input standard).
Non esiste, tuttavia, alcun modo per preservare una connessione tra diverse invocazioni wget
.
Altri suggerimenti
Potresti anche scrivere uno script Ruby con thread per eseguire wget su più file di input contemporaneamente per accelerare il processo. Quindi, se hai 5 file contenenti 10.000 indirizzi ciascuno, puoi usare questo script:
#!/usr/bin/ruby
threads = []
for file in ARGV
threads << Thread.new(file) do |filename|
system("wget -i #{filename}")
end
end
threads.each { |thrd| thrd.join }
Ognuno di questi thread userebbe una connessione per scaricare tutti gli indirizzi in un file. Il seguente comando significa quindi solo 5 connessioni al server per scaricare tutti i 50.000 file.
./fetch.rb "list1.txt" "list2.txt" "list3.txt" "list4.txt" "list5.txt"
Potresti anche scrivere un piccolo programma (in Java o C o altro) che invia l'elenco di file come richiesta POST e il server restituisce un oggetto con i dati su di essi. Neanche dovrebbe essere troppo lento.