realtek r8169 Realtek RTL8111
做一个监控
Strategized optimal method for launching network monitoring script automatically.
2s
用户想要将网络监控脚本设置为开机自动运行。在CentOS 8.4上,有几种方法可以实现开机自启动:
最好的方法是创建一个systemd service,因为:
我需要创建一个systemd service文件,并提供完整的设置步骤。
当然可以!我推荐使用 systemd 服务来设置开机自动运行,这是最稳定和现代的方法。
方法一:创建 systemd 服务(推荐)
网络监控systemd服务配置
Code
# 1. 创建systemd服务文件 cat > /etc/systemd/system/network-monitor.service << 'EOF' [Unit] Description=Enhanced Network Monitor Service Documentation=Network monitoring and auto-recovery for Realtek r8169 driver After=network.target NetworkManager.service
Mapped out comprehensive service setup and management steps.
0s
我需要提供完整的安装和配置步骤,包括如何管理这个服务,以及其他备用方法。
完整的开机自启动设置步骤
步骤1:确保脚本在正确位置
bash
# 将脚本放在 /root/ 目录
cp enhanced_network_monitor.sh /root/
chmod +x /root/enhanced_network_monitor.sh
步骤2:创建并配置 systemd 服务
bash
# 执行上面artifact中的命令
# 或者手动创建服务文件:
cat > /etc/systemd/system/network-monitor.service << 'EOF'
[Unit]
Description=Enhanced Network Monitor Service
Documentation=Network monitoring and auto-recovery for Realtek r8169 driver
After=network.target NetworkManager.service
Wants=network.target
Requires=NetworkManager.service
[Service]
Type=simple
User=root
Group=root
ExecStart=/root/enhanced_network_monitor.sh
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
RestartSec=10
TimeoutStopSec=30
# 日志设置
StandardOutput=journal
StandardError=journal
SyslogIdentifier=network-monitor
# 环境变量
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[Install]
WantedBy=multi-user.target
EOF
步骤3:启用和启动服务
bash
# 重新加载systemd配置
systemctl daemon-reload
# 启用开机自启动
systemctl enable network-monitor.service
# 立即启动服务
systemctl start network-monitor.service
# 检查服务状态
systemctl status network-monitor.service
# 1. 创建systemd服务文件
cat > /etc/systemd/system/network-monitor.service << 'EOF'
[Unit]
Description=Enhanced Network Monitor Service
Documentation=Network monitoring and auto-recovery for Realtek r8169 driver
After=network.target NetworkManager.service
Wants=network.target
Requires=NetworkManager.service
[Service]
Type=simple
User=root
Group=root
ExecStart=/root/enhanced_network_monitor.sh
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
RestartSec=10
TimeoutStopSec=30
# 日志设置
StandardOutput=journal
StandardError=journal
SyslogIdentifier=network-monitor
# 安全设置
NoNewPrivileges=false
PrivateDevices=false
# 环境变量
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[Install]
WantedBy=multi-user.target
EOF
# 2. 设置脚本权限和路径
chmod +x /root/enhanced_network_monitor.sh
# 3. 重新加载systemd配置
systemctl daemon-reload
# 4. 启用服务(开机自启动)
systemctl enable network-monitor.service
# 5. 启动服务
systemctl start network-monitor.service
# 6. 检查服务状态
echo "=== 服务状态检查 ==="
systemctl status network-monitor.service
echo "=== 检查是否启用开机自启 ==="
systemctl is-enabled network-monitor.service
echo "=== 检查服务是否正在运行 ==="
systemctl is-active network-monitor.service
################################增强版网络监控脚本
#!/bin/bash
# 增强版网络监控和诊断脚本
# 针对 Realtek r8169 驱动问题进行深度监控
LOG_FILE="/var/log/network_debug.log"
INTERFACE="enp2s0"
LAST_CHECK_FILE="/tmp/last_network_check"
# 创建日志文件
touch $LOG_FILE
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}
# 记录正常状态(用于对比)
log_normal_status() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - [正常] 网络连接正常" >> $LOG_FILE
echo "$(date '+%Y-%m-%d %H:%M:%S')" > $LAST_CHECK_FILE
}
check_network() {
# 多重检查网络连通性
local ping_result=0
local dns_result=0
local http_result=0
# 检查1:ping测试
if ping -c 1 -W 3 8.8.8.8 > /dev/null 2>&1; then
ping_result=1
fi
# 检查2:DNS解析测试
if nslookup baidu.com > /dev/null 2>&1; then
dns_result=1
fi
# 检查3:HTTP连接测试
if curl -s --max-time 5 http://www.baidu.com > /dev/null 2>&1; then
http_result=1
fi
# 如果所有测试都失败,认为网络异常
if [ $ping_result -eq 0 ] && [ $dns_result -eq 0 ] && [ $http_result -eq 0 ]; then
return 1
else
return 0
fi
}
collect_debug_info() {
log_message "=== 网络问题检测到,开始收集调试信息 ==="
# 计算问题发生的时间间隔
if [ -f $LAST_CHECK_FILE ]; then
local last_time=$(cat $LAST_CHECK_FILE)
local current_time=$(date '+%Y-%m-%d %H:%M:%S')
log_message "上次正常时间: $last_time"
log_message "问题发生时间: $current_time"
fi
# 网络接口状态
log_message "网络接口状态:"
ip link show >> $LOG_FILE 2>&1
# IP地址信息
log_message "IP地址信息:"
ip addr show $INTERFACE >> $LOG_FILE 2>&1
# 路由表
log_message "路由表:"
ip route show >> $LOG_FILE 2>&1
# 网络统计
log_message "网络统计:"
cat /proc/net/dev >> $LOG_FILE 2>&1
# 网卡详细状态
log_message "网卡ethtool状态:"
ethtool $INTERFACE >> $LOG_FILE 2>&1
# 网卡统计信息
log_message "网卡统计信息:"
ethtool -S $INTERFACE >> $LOG_FILE 2>&1
# 内核消息(重点关注网络相关)
log_message "最近内核消息:"
dmesg | tail -50 | grep -E "(r8169|r8168|enp2s0|network|eth)" >> $LOG_FILE 2>&1
# 完整的最近内核消息
log_message "完整的最近内核消息:"
dmesg | tail -20 >> $LOG_FILE 2>&1
# 系统资源
log_message "内存使用:"
free -h >> $LOG_FILE 2>&1
log_message "CPU使用:"
top -bn1 | head -20 >> $LOG_FILE 2>&1
log_message "文件描述符使用:"
cat /proc/sys/fs/file-nr >> $LOG_FILE 2>&1
# 网络服务状态
log_message "NetworkManager状态:"
systemctl status NetworkManager --no-pager >> $LOG_FILE 2>&1
# 连接统计
log_message "网络连接数:"
ss -tuln | wc -l >> $LOG_FILE 2>&1
# 详细连接信息
log_message "详细连接信息:"
ss -tuln >> $LOG_FILE 2>&1
# 检查驱动模块状态
log_message "网络驱动模块状态:"
lsmod | grep -E "(r8169|r8168)" >> $LOG_FILE 2>&1
# 检查网卡硬件信息
log_message "网卡硬件信息:"
lspci -v | grep -A 10 "Ethernet" >> $LOG_FILE 2>&1
# 检查是否有网络相关的进程异常
log_message "网络相关进程:"
ps aux | grep -E "(NetworkManager|dhclient|network)" >> $LOG_FILE 2>&1
# 检查系统负载
log_message "系统负载:"
uptime >> $LOG_FILE 2>&1
# 检查磁盘使用(可能影响日志和缓存)
log_message "磁盘使用:"
df -h >> $LOG_FILE 2>&1
log_message "=== 调试信息收集完成 ==="
}
restart_network() {
log_message "尝试重启网络服务..."
# 方法1:重启NetworkManager
systemctl restart NetworkManager
sleep 10
if check_network; then
log_message "NetworkManager重启成功,连接恢复"
return 0
fi
# 方法2:重新加载网卡驱动(针对r8169问题)
log_message "尝试重新加载网卡驱动..."
modprobe -r r8169
sleep 2
modprobe r8169
sleep 10
# 重新配置网卡参数
ethtool -s $INTERFACE wol d 2>/dev/null
ethtool -s $INTERFACE speed 1000 duplex full autoneg off 2>/dev/null
systemctl restart NetworkManager
sleep 10
if check_network; then
log_message "驱动重新加载成功,连接恢复"
return 0
else
log_message "所有自动修复方法失败,需要手动干预"
return 1
fi
}
# 启动时记录系统信息
log_message "=== 网络监控脚本启动 ==="
log_message "监控接口: $INTERFACE"
log_message "系统信息: $(uname -a)"
log_message "网卡驱动: $(ethtool -i $INTERFACE | grep driver)"
log_message "当前网络状态:"
ethtool $INTERFACE | grep -E "(Speed|Duplex|Link)" >> $LOG_FILE
# 主监控循环
log_message "开始监控循环,检查间隔: 30秒"
while true; do
if ! check_network; then
log_message "检测到网络连接问题"
collect_debug_info
# 尝试重启网络服务
if restart_network; then
log_message "问题已通过重启网络服务解决"
else
log_message "需要手动干预或重启系统"
# 发送紧急通知(如果配置了邮件)
# echo "网络故障需要人工干预" | mail -s "服务器网络故障" admin@example.com
fi
else
# 网络正常时也记录状态(每10分钟记录一次)
current_minute=$(date +%M)
if [ $((current_minute % 10)) -eq 0 ] && [ "$(date +%S)" -lt 30 ]; then
log_normal_status
fi
fi
# 每30秒检查一次
sleep 30
done