在Linux系统中,循环检测网口状态是网络运维中的常见需求,例如监控网口是否UP、流量异常、丢包情况等,以便及时发现网络故障,通过编写bash脚本结合系统工具,可以实现自动化的循环检测,以下是具体实现方法和注意事项。
明确检测目标
在编写脚本前,需先确定检测的具体内容,常见的网口检测指标包括:
- 网口状态:是否处于UP(启用)或DOWN(禁用)状态;
- 流量统计:接收(RX)和发送(TX)的字节数、包数量;
- 连通性:通过ping测试网口与目标主机的连通性;
- 错误包:如CRC错误、丢包率等(需网卡支持)。
选择检测工具
Linux提供了多种命令行工具用于网口检测,以下是常用工具及其功能:
工具名 | 主要功能 | 常用示例命令 |
---|---|---|
ip |
查看网口状态、地址、路由等 | ip link show eth0 |
ethtool |
查看网卡详细信息、流量、错误统计 | ethtool -S eth0 |
ifconfig |
传统网口配置工具(部分系统已弃用) | ifconfig eth0 | grep "RX packets" |
ping |
测试网络连通性 | ping -c 4 192.168.1.1 |
awk /sed |
提取命令输出中的关键信息 | ip link show eth0 | awk '/state/ {print $9}' |
编写循环检测脚本
以下是一个基础脚本示例,实现每10秒检测一次网口eth0
的状态、流量和连通性,并将结果输出到终端和日志文件:
#!/bin/bash # 定义网口和检测间隔 INTERFACE="eth0" INTERVAL=10 LOG_FILE="/var/log/network_monitor.log" # 检查网口是否存在 if ! ip link show "$INTERFACE" > /dev/null 2>&1; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:网口 $INTERFACE 不存在!" >> "$LOG_FILE" exit 1 fi # 循环检测 while true; do TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') # 1. 检测网口状态 STATE=$(ip link show "$INTERFACE" | awk '/state/ {print $9}') # 2. 检测流量统计(RX和TX字节数) STATS=$(ip -s link show "$INTERFACE") RX_BYTES=$(echo "$STATS" | awk '/RX:/ {getline; print $1}') TX_BYTES=$(echo "$STATS" | awk '/TX:/ {getline; print $1}') # 3. 检测连通性(ping 4次,获取丢包率) PING_RESULT=$(ping -c 4 8.8.8.8 2>&1) PACKET_LOSS=$(echo "$PING_RESULT" | grep -o "packet loss" | awk '{print $1}') # 输出结果到终端 echo "----------------------------------------" echo "[$TIMESTAMP] 网口检测报告:" echo "网口状态:$STATE" echo "接收字节数:$RX_BYTES" echo "发送字节数:$TX_BYTES" echo "丢包率:$PACKET_LOSS" # 记录到日志文件 echo "[$TIMESTAMP] 网口状态:$STATE | RX: $RX_BYTES | TX: $TX_BYTES | 丢包率:$PACKET_LOSS" >> "$LOG_FILE" # 状态异常时告警(可选) if [ "$STATE" != "UP" ]; then echo "[$TIMESTAMP] 警告:网口 $INTERFACE 状态异常!当前状态:$STATE" >> "$LOG_FILE" fi # 休眠指定间隔 sleep "$INTERVAL" done
脚本优化与扩展
-
参数化配置:通过命令行参数指定网口和检测间隔,
INTERFACE=$1 INTERVAL=$2
执行时通过
./script.sh eth0 5
指定网口和间隔。 -
流量速率计算:通过两次采样的字节数差值,计算每秒接收/发送速率:
PREV_RX=0 PREV_TX=0 # 在循环中计算 RX_RATE=$(( (RX_BYTES - PREV_RX) / INTERVAL )) TX_RATE=$(( (TX_BYTES - PREV_TX) / INTERVAL )) PREV_RX=$RX_BYTES PREV_TX=$TX_BYTES
-
多网口检测:使用
for
循环遍历多个网口,for INTERFACE in eth0 eth1; do # 检测逻辑 done
-
日志轮转:避免日志文件过大,使用
logrotate
工具定期切割日志,或在脚本中添加日志文件大小判断,超过指定大小后备份并清空。
FAQs
问题1:如何让检测脚本在后台持续运行,避免终端关闭后脚本终止?
解答:可通过以下方式实现后台持续运行:
- 使用
nohup
命令:nohup ./monitor_script.sh > /dev/null 2>&1 &
,输出会被重定向到nohup.out
,&
表示后台运行。 - 使用
screen
或tmux
工具:先启动screen
,运行脚本后按Ctrl+A+D
detached,下次可通过screen -r
重新 attached。 - 配置为系统服务:创建
systemd
服务单元文件(如/etc/systemd/system/network-monitor.service
),通过systemctl start network-monitor
启动,并设置开机自启。
问题2:如何根据检测结果触发告警(如邮件或短信)?
解答:可在脚本中添加告警逻辑,例如使用mail
命令发送邮件,或调用第三方API发送短信,以下是以邮件告警为例(需系统已配置邮件服务):
# 在脚本的状态异常检测部分添加 if [ "$STATE" != "UP" ]; then ALERT_MSG="[$TIMESTAMP] 网口 $INTERFACE 状态异常!当前状态:$STATE,请立即检查!" echo "$ALERT_MSG" | mail -s "网口故障告警" admin@example.com echo "[$TIMESTAMP] 已发送告警邮件" >> "$LOG_FILE" fi
若需短信告警,可接入短信平台API(如阿里云短信、腾讯云短信),使用curl
命令调用接口发送短信内容,具体API调用方式需参考平台文档。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/15366.html