如何扩展Syslog监控脚本以同时监控UniFi交换机多个端口
多端口监控扩展方案(避免阻塞)
你的核心问题是原脚本在处理端口延迟启用时的sleep 5m会阻塞整个监控循环,导致其他端口的事件无法及时处理。解决思路是把每个端口的禁用+延迟启用操作放到后台异步执行,让主监控循环保持持续运行,同时通过锁文件避免同一端口被重复触发。
下面是修改后的完整脚本:
#!/bin/bash # 配置要监控的端口列表 MONITORED_PORTS=(43 44 45) LOGFILE="/home/user/scripts/uni_port_monitor.$(date +%Y-%m-%d_%H%M).log" SWITCH_IDENTIFIER="USW-Pro-48-PoE-7.1.26+15869: switch: TRAPMGR: Link Down: 0/" # 初始化日志输出 exec 1>> >(ts '[%Y-%m-%d %H:%M:%S]' > "$LOGFILE") 2>&1 echo "Starting multi-port monitoring for ports: ${MONITORED_PORTS[*]}" # 定义处理端口断开的函数 handle_port_down() { local port=$1 local lock_file="/tmp/uni_port_${port}_lock" # 检查是否已有正在处理的任务,避免重复触发 if [ -f "$lock_file" ]; then echo "Port $port is already being handled, skipping duplicate trigger" return fi # 创建锁文件 touch "$lock_file" echo "Port $port disconnected, disabling it now" /home/user/scripts/adminp${port}.sh echo "Waiting 5 minutes before re-enabling port $port" sleep 5m echo "Re-enabling port $port" /home/user/scripts/adminp${port}on.sh # 删除锁文件,释放任务权限 rm "$lock_file" } # 持续监控syslog tail -fn0 /var/log/syslog | while read -r line; do # 遍历所有监控端口,检查当前日志行是否匹配对应端口的Link Down事件 for port in "${MONITORED_PORTS[@]}"; do if echo "$line" | grep -q "${SWITCH_IDENTIFIER}${port}"; then # 后台执行处理函数,不阻塞主循环 handle_port_down "$port" & fi done done
关键改进点:
- 异步处理:用
&把handle_port_down放到后台执行,主监控循环不会被sleep阻塞,能实时处理其他端口的日志事件 - 端口配置化:通过
MONITORED_PORTS数组统一管理要监控的端口,新增/删除端口只需要修改数组 - 重复触发防护:用临时锁文件
/tmp/uni_port_${port}_lock避免同一端口在5分钟冷却期内被多次触发(比如网络波动导致多次Link Down日志) - 代码复用:通过函数
handle_port_down统一处理端口逻辑,不用为每个端口写重复代码
注意事项:
- 确保每个端口对应的
adminpX.sh和adminpXon.sh脚本存在且可执行(X为端口号) - 如果需要调整冷却时间,直接修改
sleep 5m即可(比如sleep 3m是3分钟) - 系统重启会自动清理/tmp下的锁文件,也可以在脚本开头添加手动清理逻辑
内容的提问来源于stack exchange,提问作者Smirnulf
相关产品推荐
相关产品推荐

