You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动