直接读取 /sys/class/net/eth0/carrier 是最轻量、实时的物理链路检测方式,值为1表示连通、0表示断开,配合 inotifywait 监听变更并辅以2秒兜底轮询,可实现毫秒级响应与高可靠性报警。

直接读取 /sys/class/net/eth0/carrier 文件是最轻量、最实时的物理链路检测方式,它反映的是网卡 PHY 层是否检测到对端信号(即网线插拔或交换机端口 down),无需依赖 IP 层或协议栈,天然支持毫秒级响应。
carrier 文件的含义和可靠性
/sys/class/net/eth0/carrier 是内核暴露的只读接口,值为 1 表示物理链路连通,0 表示断开(如拔线、交换机掉电、光模块无光)。它不依赖 ARP、ICMP 或路由状态,不受防火墙或网络配置影响,是判断“物理断连”的黄金标准。注意:该文件仅对支持 carrier detect 的驱动有效(绝大多数有线网卡都支持,Wi-Fi 和部分虚拟网卡不适用)。
用 inotifywait 实现低开销秒级轮询替代
频繁轮询(如每 100ms cat 一次)虽简单但浪费 CPU;更优解是监听文件变化事件:
- 安装 inotify-tools:
apt install inotify-tools(Debian/Ubuntu)或yum install inotify-tools(CentOS/RHEL) - 脚本中用
inotifywait -m -e attrib /sys/class/net/eth0/carrier持续监听属性变更(carrier 变化会触发 attrib 事件) - 配合
while read循环解析输出,一旦捕获到变更,立即cat /sys/class/net/eth0/carrier确认当前值 - 若读出为
0,立刻触发报警(如写日志、发短信、调用 webhook)
兜底轮询 + 超时机制防事件丢失
inotify 在极端情况(如内核事件队列溢出、短时高负载丢事件)下可能漏报,建议叠加轻量轮询作为保险:
- 主循环中每 2 秒执行一次
cat /sys/class/net/eth0/carrier 2>/dev/null - 若连续 2 次读到
0(避免毛刺干扰),且距离上次报警超过 30 秒,则触发报警 - 报警后记录时间戳,避免重复告警;恢复为
1时可发恢复通知
报警动作要简洁可控
秒级报警的关键是快而稳,避免阻塞监控主线程:
- 使用异步方式发通知,例如:
logger -t "net-alert" "eth0 carrier down at $(date)"写系统日志 - 调用外部命令时加超时限制,如
timeout 5s curl -fsS --data "alert=eth0-down" http://monitor/api/v1/alert & - 避免在报警逻辑里做复杂计算或阻塞 I/O;所有耗时操作应后台化或丢弃











