HOME老电脑网卡

realtek r8169   Realtek RTL8111
做一个监控

 

Strategized optimal method for launching network monitoring script automatically.

2s

用户想要将网络监控脚本设置为开机自动运行。在CentOS 8.4上,有几种方法可以实现开机自启动:

  1. systemd service(推荐)
  2. rc.local
  3. crontab @reboot

最好的方法是创建一个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