Linux下可用dig脚本监控DNS解析耗时:提取Query time毫秒值,记录日志并阈值告警(如>300ms),通过cron每5分钟执行,支持统计平均延迟与日志轮转。

在 Linux 系统中,可通过编写 Shell 脚本结合 dig 或 nslookup 测量 DNS 解析耗时,并用 cron 实现定期执行。核心是获取权威响应时间、记录日志、支持异常判断和轻量告警。
用 dig 获取精准解析耗时
dig 的 +stats 输出包含查询耗时(Query time),比 nslookup 更稳定可靠。推荐使用如下命令格式:
-
dig +short +stats example.com @8.8.8.8 2>&1 | grep "Query time" | awk '{print $4}'—— 提取毫秒数 - 加
@8.8.8.8指定 DNS 服务器,避免受本地缓存干扰 - 加
+short减少输出干扰;2>&1合并 stderr(含 stats)到 stdout 方便管道处理
编写可记录、可判断的监控脚本
保存为 /opt/bin/check_dns.sh,赋予执行权限(chmod +x),内容示例:
#!/bin/bash
DOMAINS=("google.com" "github.com" "your-company.com")
DNS_SERVER="223.5.5.5" # 阿里 DNS,国内延迟低
LOG_FILE="/var/log/dns_monitor.log"
THRESHOLD=300 # 超过 300ms 视为异常
<p>for domain in "${DOMAINS[@]}"; do
time_ms=$(dig +short +stats "$domain" @"$DNS_SERVER" 2>&1 | grep "Query time" 2>/dev/null | awk '{print $4}')
if [[ -z "$time_ms" ]] || [[ "$time_ms" -lt 1 ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') ERROR: $domain failed to resolve" >> "$LOG_FILE"
continue
fi
echo "$(date '+%Y-%m-%d %H:%M:%S') OK: $domain → ${time_ms}ms" >> "$LOG_FILE"
if [[ "$time_ms" -gt "$THRESHOLD" ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') ALERT: $domain slow (${time_ms}ms > ${THRESHOLD}ms)" >> "$LOG_FILE"</p><h1>可在此添加简单通知,如:echo "$domain slow" | mail -s "DNS Alert" admin@example.com</h1><p>fi
done
用 cron 定期执行(例如每 5 分钟一次)
运行 crontab -e,添加一行:
*/5 * * * * /opt/bin/check_dns.sh
注意:
- 脚本中使用绝对路径(如 /usr/bin/dig 更稳妥,可用 which dig 确认)
- cron 环境变量精简,建议在脚本开头显式声明 PATH:PATH=/usr/local/bin:/usr/bin:/bin
可选增强:生成简易统计与趋势参考
每日末尾追加一行统计,便于人工巡检:
- 用
awk '/OK:/ {sum+=$NF; n++} END {if(n) print "Avg:", sum/n "ms"}'统计当日平均耗时 - 配合
logrotate按天轮转日志,避免单文件过大 - 若需可视化,可将日志导入 Prometheus + Grafana(通过 textfile collector)


















