强制 wget 超时

强制 wget 超时

我怎样才能强制 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

相关内容