晚上,
我使用xargs
运行了很多wget命令cat urls.txt | xargs -n 1 -P 10 wget -q -t 2 --timeout 10 --dns-timeout 10 --connect-timeout 10 --read-timeout 20
但是,一旦解析了文件,一些wget实例就会挂起。我仍然可以在系统监视器中看到它们,它们大约需要2分钟才能完成。
无论如何,我可以指定实例应在10秒后被杀死吗?我可以重新下载以后失败的所有网址。
在系统监视器中,wget实例在挂起时显示为sk_wait_data。 xargs有'do_wait',但是wget似乎是问题,因为一旦我杀了它们,我的脚本就会继续。
答案 0 :(得分:2)
我相信应该这样做:
wget -v -t 2 --timeout 10
根据文件:
检查详细输出,看看它正在做什么。
此外,您可以尝试:
timeout 10 wget -v -t 2
或者你可以做内部超时:
( cmdpid=$BASHPID; (sleep 10; kill $cmdpid) & exec wget -v -t 2 )
(见:BASH FAQ entry #68: "How do I run a command, and have it abort (timeout) after N seconds?")
答案 1 :(得分:1)
GNU Parallel可以并行下载,并在超时后重试该过程:
cat urls.txt | parallel -j10 --timeout 10 --retries 3 wget -q -t 2
如果获取网址的时间发生了变化(例如,由于互联网连接速度加快),则可以让GNU Parallel计算超时时间:
cat urls.txt | parallel -j10 --timeout 1000% --retries 3 wget -q -t 2
这将使GNU Parallel记录成功作业的中值时间,并将超时动态设置为该时间的10倍。