我怎样才能强制 wget 在 X 秒后停止?
我有一个下载图像的脚本,有时会卡住并拒绝“超时”。
我尝试过的:
--tries=3 --connect-timeout=30
从ps aux
:
root 26543 0.0 0.0 38636 1656 ? S 20:40 0:00 wget -nc --tries=3 --connect-timeout=30 --restrict-file-names=nocontrol -O 18112012/image.jpg http://site/image.jpg
答案1
您可以将 wget 命令作为后台进程运行,并在休眠一定时间后发送 SIGKILL 强制终止它。
wget ... &
wget_pid=$!
counter=0
timeout=60
while [[ -n $(ps -e) | grep "$wget_pid") && "$counter" -lt "$timeout" ]]
do
sleep 1
counter=$(($counter+1))
done
if [[ -n $(ps -e) | grep "$wget_pid") ]]; then
kill -s SIGKILL "$wget_pid"
fi
解释:
wget ... &
-&
最后的符号表示在后台运行命令,而不是在前台运行wget_pid=$!
-$!
是一个特殊的 shell 变量,它包含最近执行的命令的进程 ID。这里我们将其保存到名为 的变量中wget_pid
。while [[ -n $(ps -e) | grep "$wget_pid") && "$counter" -lt "$timeout" ]]
- 每秒查找一次该进程,如果它仍然存在,则继续等待,直到超时限制。kill -s SIGKILL "$wget_pid"
- 我们kill
通过向后台运行的 wget 进程发送一个SIGKILL 信号。
答案2
最简单的方法是使用timeout(1)
命令,它是 GNU coreutils 的一部分,因此几乎可以在安装了 bash 的任何地方使用:
timeout 60 wget ..various wget args..
或者如果你想在 wget 运行时间过长时强制终止它:
timeout -s KILL 60 wget ..various wget args..
答案3
最近的wget
版本(至少 1.19+)允许设置超时:
-T, --timeout=SECONDS set all timeout values to SECONDS
--dns-timeout=SECS set the DNS lookup timeout to SECS
--connect-timeout=SECS set the connect timeout to SECS
--read-timeout=SECS set the read timeout to SECS
--waitretry=SECONDS wait 1..SECONDS between retries of a retrieval
-t, --tries=NUMBER set number of retries to NUMBER (0 unlimits)
例子
wget --timeout 4 --tries 1 "https://www.google.com/"
此示例将尝试连接一次并获取 URLhttps://www.google.com。4秒后将会超时。
答案4
我最近注意到 wget1.14默默地忽略 --timeout选项,当我将其更新为1.19