首页 > 解决方案 > 在 wget 中处理超时

问题描述

我有一个 bash 脚本来检查CHECKURL变量是否有响应。如果 url 无效或不存在,脚本会立即退出并回显消息“NOT VALID URL”

我有一个问题,其中 url https://valid-url-sample.com是一个有效的 url,但是我的 IP 在负载均衡器上被拒绝,因为它只响应来自特定 IP 的 443 请求。结果是脚本一直运行,直到我需要control+c为止。我希望脚本处理这种情况并回显"VALID BUT NOT REACHABLE",我还在 wget 命令上添加了超时,但仍然没有运气。关于如何处理这个问题的任何想法?

脚本

#!/bin/bash


TARGET=$1
CHECKURL=$(wget -S -t 1 --timeout=600 --spider https://${TARGET} --no-check-certificate 2>&1 | awk '/HTTP\// {print $2}')


if [[ ${CHECKURL} ]]; then
  echo "VALID URL"
else
  if [[ $? != 0 ]]; then
    echo "NOT A VALID URL"
  else
    echo "VALID BUT NOT REACHABLE"        
  fi
fi

示例脚本执行

[root@ip-192-69-69-69 ~]# ./script.sh google.com
VALID URL

标签: bashtimeoutwget

解决方案


您可能想要使用这样的日志文件:.

#!/bin/bash

TARGET="$1"

if wget -S -t 1 --timeout=600 --spider https://"${TARGET}" --no-check-certificate > log.txt 2>&1; then
    echo "VALID URL"
else
    error="$(awk 'BEGIN { IGNORECASE=1 } /( failed| error| bad|unable | invalid| unrecognized)/ { err=$0 } END { if(match(err,/http:\/\/: Invalid host name/)) err=""; printf("%s",err) }' log.txt)"
    # Connection reset by peer, Connection timed out, Network is unreachable.
    if printf '%s' "$error" | grep -qiE '( peer| timed| unreachable)'; then
        echo "VALID BUT UNREACHABLE"
    # ERROR 403: Access denied/Forbidden.
    elif printf '%s' "$error" | grep -q ' 403'; then
        echo "FORBIDDEN"
    # Not Found.
    elif printf '%s' "$error" | grep -q ' 404'; then
        echo "NOT FOUND"
    # Fatal error.
    else
         echo "FATAL ERROR"
         echo "$error"
    fi
    exit 1 # Exit the script
fi

# Delete the temporary log file.
# rm -f log.txt

推荐阅读