Bash脚本需求:基于IP文件实现无限循环ping检测及日志管控
没问题,我帮你梳理出一个完全满足需求的方案,不仅解决无限循环的问题,还把日志分割、自动清理这些细节都处理到位了👇
完整实现方案
核心脚本代码
#!/bin/bash # 配置参数,按需修改 IP_FILE="./IP" # 你的IP列表文件路径 LOG_DIR="/tmp/output" # 日志存储目录 MAX_LOG_SIZE=$((1*1024*1024)) # 单日志文件上限:1MB(字节数) CHECK_INTERVAL=300 # 检测间隔:5分钟(秒数) RETENTION_DAYS=7 # 日志保留天数:7天 # 先确保日志目录存在,避免报错 mkdir -p "$LOG_DIR" # 无限循环执行检测 while true; do # 生成当日日志文件名 LOG_FILE="$LOG_DIR/out-$(date +%F)" # 检查日志大小,超过1MB就重命名归档 if [ -f "$LOG_FILE" ] && [ $(stat -c%s "$LOG_FILE") -ge $MAX_LOG_SIZE ]; then mv "$LOG_FILE" "$LOG_FILE-$(date +%H%M%S)" fi # 写入检测时间戳,方便排查 echo "=== 检测时间: $(date '+%Y-%m-%d %H:%M:%S') ===" >> "$LOG_FILE" # 读取IP列表执行ping检测 while read -r IP; do # 跳过空行和注释行(注释行以#开头) [[ -z "$IP" || "$IP" =~ ^# ]] && continue # ping检测:-c1发1个包,-W2超时2秒,避免卡太久 if ping -c1 -W2 "$IP" &>/dev/null; then echo "$IP is up" >> "$LOG_FILE" else echo "$IP is down" >> "$LOG_FILE" fi done < "$IP_FILE" # 自动删除7天前的旧日志 find "$LOG_DIR" -type f -name "out-*" -mtime +$RETENTION_DAYS -delete # 等待5分钟后再次检测 sleep $CHECK_INTERVAL done
关键功能拆解说明
1. 无限循环+定时检测
外层的while true实现持续运行,每次检测完成后用sleep 300(刚好5分钟)等待下一轮,完美解决你原来无法结合无限循环的问题。
2. 单日志文件大小控制
每次检测前会检查当前日志的字节数,一旦超过1MB就用「当前时分秒」重命名旧日志,新的检测内容会写入新的同名文件,避免日志文件越来越大不好管理。
3. 灵活的IP列表处理
脚本会自动跳过IP文件里的空行和以#开头的注释行,你可以在IP文件里加备注,比如:
# 生产环境服务器 192.168.1.1 192.168.1.2 # 测试环境服务器 192.168.2.1
同时给ping命令加了-W2超时设置,单个IP最多等2秒,不会因为某台服务器超时拖慢整个检测流程。
4. 旧日志自动清理
每次检测完成后,用find命令扫描日志目录,删除7天前的所有日志文件,不用手动清理,省心省力。
额外优化建议
并行ping提速
如果100台服务器逐个检测耗时太长(比如原来加sleep 2要200秒),可以改成并行执行,把每个ping任务放到后台,最后等待全部完成,检测时间会压缩到2秒左右:
# 替换原来的IP检测循环为以下代码 while read -r IP; do [[ -z "$IP" || "$IP" =~ ^# ]] && continue # 把ping任务放到后台执行 ( if ping -c1 -W2 "$IP" &>/dev/null; then echo "$IP is up" >> "$LOG_FILE" else echo "$IP is down" >> "$LOG_FILE" fi ) & done < "$IP_FILE" wait # 等待所有后台ping任务完成
后台持续运行
如果想让脚本一直在后台跑,即使关闭终端也不停止,可以用nohup启动:
nohup ./ping_check.sh >/dev/null 2>&1 &
这样脚本会在后台持续运行,不会产生多余的输出。
用logrotate管理日志(更专业)
如果觉得脚本里的大小判断不够灵活,可以用系统自带的logrotate工具来管理日志。创建/etc/logrotate.d/ping_check文件,内容如下:
/tmp/output/out-* { daily size 1M rotate 7 missingok notifempty compress }
logrotate会自动按天/按大小分割日志,保留最近7天的文件,还会自动压缩旧日志,适合长期运行的场景。
内容的提问来源于stack exchange,提问作者user183980




