首页
/ 2025超强XMRig脚本:7×24小时无间断运行的自动重启与故障恢复方案

2025超强XMRig脚本:7×24小时无间断运行的自动重启与故障恢复方案

2026-02-04 05:15:46作者:滕妙奇

你是否曾因进程意外崩溃导致任务中断?是否在凌晨3点被系统警报惊醒?本文将系统讲解如何构建企业级XMRig守护脚本,通过进程监控、错误自愈、资源优化三重保障,实现99.99%的服务可用性。读完本文你将掌握:

  • 3种跨平台自动重启方案的实现与对比
  • 10类故障场景的智能检测与恢复策略
  • 内存/CPU资源优化的5个关键脚本配置
  • 完整的日志分析与告警系统搭建方法

一、脚本基础架构

1.1 最小可行脚本实现

XMRig官方提供的基础脚本仅包含启动命令,缺乏故障处理能力:

:: 官方基础脚本 (pool_mine_example.cmd)
cd /d "%~dp0"
xmrig.exe -o xmrpool.eu:3333 -u YOUR_WALLET_ADDRESS -p x
pause

这种脚本在遇到网络波动、连接失败或性能骤降时会直接退出,造成任务中断。我们需要构建包含进程守护错误检测自动恢复三大模块的增强脚本。

1.2 脚本架构设计

flowchart TD
    A[启动入口] --> B{环境检查}
    B -->|通过| C[系统优化预处理]
    B -->|失败| D[修复或退出]
    C --> E[启动XMRig进程]
    E --> F[监控循环]
    F -->|正常运行| G[记录状态]
    F -->|检测异常| H[故障分类]
    H --> I[轻度错误: 重启进程]
    H --> J[重度错误: 系统修复]
    I --> E
    J --> C

二、跨平台自动重启实现

2.1 Windows系统实现(批处理+任务计划程序)

增强型脚本 (xmrig_guard.bat)

@echo off
setlocal enabledelayedexpansion

:: 配置区域
set WALLET=48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD
set POOL=xmrpool.eu:3333
set LOG_FILE=xmrig_mining.log
set MAX_RESTARTS=10
set RESTART_DELAY=30
set CONFIG_FILE=config.json

:: 初始化计数器
set restart_count=0
set error_count=0

:monitor_loop
:: 检查重启次数是否超限
if %restart_count% geq %MAX_RESTARTS% (
    echo 达到最大重启次数 %MAX_RESTARTS%,程序退出 >> %LOG_FILE%
    exit /b 1
)

:: 记录启动信息
echo [%date% %time%] 启动XMRig (第 %restart_count% 次尝试) >> %LOG_FILE%

:: 启动XMRig并等待退出
xmrig.exe -c %CONFIG_FILE% -o %POOL% -u %WALLET% -p x >> %LOG_FILE% 2>&1
set exit_code=%errorlevel%

:: 记录退出信息
echo [%date% %time%] XMRig退出,代码: %exit_code% >> %LOG_FILE%

:: 分析退出码
if %exit_code% equ 0 (
    echo 正常退出,程序终止 >> %LOG_FILE%
    exit /b 0
) else if %exit_code% equ 2 (
    echo 配置文件错误,需要人工干预 >> %LOG_FILE%
    exit /b 2
) else if %exit_code% equ 4 (
    echo 网络错误,即将重试 >> %LOG_FILE%
    set /a error_count+=1
    if %error_count% geq 3 (
        echo 多次网络错误,执行网络修复 >> %LOG_FILE%
        netsh winsock reset >> %LOG_FILE% 2>&1
        ipconfig /renew >> %LOG_FILE% 2>&1
        set error_count=0
    )
) else (
    echo 未知错误,代码: %exit_code% >> %LOG_FILE%
)

:: 递增重启计数器并等待
set /a restart_count+=1
echo 等待 %RESTART_DELAY% 秒后重启... >> %LOG_FILE%
timeout /t %RESTART_DELAY% /nobreak >nul
goto monitor_loop

任务计划程序配置

  1. 创建基本任务,触发器设置为"登录时"和"系统启动时"
  2. 操作选择"启动程序",浏览到批处理文件
  3. 条件选项卡勾选"唤醒计算机运行此任务"
  4. 设置选项卡勾选"任务失败时重新启动",最多尝试3次,间隔1分钟

2.2 Linux系统实现(systemd服务+bash脚本)

守护脚本 (xmrig_guard.sh)

#!/bin/bash
# 守护进程脚本 v2.0
# 配置区域
WALLET="48edfHu7V9Z84YzzMa6fUueoELZ9ZRXq9VetWzYGzKt52XU5xvqgzYnDK9URnRoJMk1j8nLwEVsaSWJ4fhdUyZijBGUicoD"
POOL="xmrpool.eu:3333"
LOG_FILE="/var/log/xmrig_mining.log"
CONFIG_FILE="/etc/xmrig/config.json"
MAX_RESTARTS=10
RESTART_DELAY=30
HEALTH_CHECK_INTERVAL=60

# 系统优化预处理
pre_optimize() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 执行系统优化" >> $LOG_FILE
    
    # 启用1GB大页内存
    if [ -f "/scripts/enable_1gb_pages.sh" ]; then
        /bin/bash /scripts/enable_1gb_pages.sh >> $LOG_FILE 2>&1
    fi
    
    # 应用CPU优化
    if [ -f "/scripts/randomx_boost.sh" ]; then
        /bin/bash /scripts/randomx_boost.sh >> $LOG_FILE 2>&1
    fi
    
    # 设置进程优先级
    renice -n -5 -p $$ >> $LOG_FILE 2>&1
}

# 健康检查函数
health_check() {
    local pid=$1
    local start_time=$(date +%s)
    
    while true; do
        # 检查进程是否存在
        if ! ps -p $pid > /dev/null; then
            return 1
        fi
        
        # 检查最近日志是否有错误
        if grep -q "error" <(tail -n 20 $LOG_FILE); then
            echo "[$(date +'%Y-%m-%d %H:%M:%S')] 检测到错误日志" >> $LOG_FILE
            return 2
        fi
        
        # 检查性能是否为零(需要xmrig支持API)
        if curl -s "http://127.0.0.1:3000/1/summary" | grep -q "\"hashrate\": {\"total\": \[0,"; then
            echo "[$(date +'%Y-%m-%d %H:%M:%S')] 检测到性能为零" >> $LOG_FILE
            return 3
        fi
        
        # 检查时间间隔
        sleep $HEALTH_CHECK_INTERVAL
        
        # 检查是否超过最大运行时间(防止内存泄漏)
        local current_time=$(date +%s)
        if [ $((current_time - start_time)) -ge 86400 ]; then
            echo "[$(date +'%Y-%m-%d %H:%M:%S')] 达到最大运行时间,主动重启" >> $LOG_FILE
            return 4
        fi
    done
}

# 主程序
main() {
    pre_optimize
    
    local restart_count=0
    
    while [ $restart_count -lt $MAX_RESTARTS ]; do
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] 启动XMRig (第 $restart_count 次尝试)" >> $LOG_FILE
        
        # 启动XMRig并记录PID
        xmrig -c $CONFIG_FILE -o $POOL -u $WALLET -p x >> $LOG_FILE 2>&1 &
        local pid=$!
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] XMRig启动,PID: $pid" >> $LOG_FILE
        
        # 执行健康检查
        health_check $pid
        local check_result=$?
        
        # 处理健康检查结果
        if [ $check_result -eq 0 ]; then
            echo "[$(date +'%Y-%m-%d %H:%M:%S')] XMRig正常退出" >> $LOG_FILE
            exit 0
        else
            echo "[$(date +'%Y-%m-%d %H:%M:%S')] 健康检查失败,代码: $check_result" >> $LOG_FILE
            
            # 如果进程仍在运行,强制终止
            if ps -p $pid > /dev/null; then
                kill -9 $pid
                sleep 5
            fi
            
            restart_count=$((restart_count + 1))
            echo "[$(date +'%Y-%m-%d %H:%M:%S')] 等待 $RESTART_DELAY 秒后重启 ($restart_count/$MAX_RESTARTS)" >> $LOG_FILE
            sleep $RESTART_DELAY
        fi
    done
    
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 达到最大重启次数,程序退出" >> $LOG_FILE
    exit 1
}

main

Systemd服务配置 (/etc/systemd/system/xmrig-miner.service)

[Unit]
Description=XMRig Service with Auto-Restart
After=network.target

[Service]
Type=simple
User=miner
Group=miner
WorkingDirectory=/data/web/disk1/git_repo/GitHub_Trending/xm/xmrig
ExecStart=/bin/bash /scripts/xmrig_guard.sh
Restart=always
RestartSec=10
KillMode=process
LimitNOFILE=1024000
LimitNPROC=infinity
LimitCORE=infinity
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

[Install]
WantedBy=multi-user.target

启用并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable xmrig-miner.service
sudo systemctl start xmrig-miner.service

2.3 三种重启方案对比

特性 Windows批处理+任务计划 Linux Systemd服务 Docker容器化方案
实现复杂度 中等
资源占用 极低
跨平台性 仅限Windows 仅限Linux 全平台
隔离性
日志管理 基础 完善 优秀
自动更新支持 复杂 中等 简单
系统资源优化 有限 丰富 中等
适用场景 个人使用 专业环境 企业级部署

三、智能故障检测与恢复策略

3.1 多维度故障检测机制

stateDiagram-v2
    [*] --> 运行中
    运行中 --> 正常: 状态良好
    运行中 --> 轻度故障: 单次错误
    运行中 --> 中度故障: 连续错误
    运行中 --> 重度故障: 致命错误
    
    轻度故障 --> 运行中: 进程重启
    中度故障 --> 系统优化: 资源清理+重启
    重度故障 --> 报警: 人工干预
    
    系统优化 --> 运行中: 重启进程
    系统优化 --> 报警: 优化失败
    
    报警 --> [*]: 终止程序
    正常 --> [*]: 正常退出

3.2 故障类型与处理策略

故障类型 特征 检测方法 恢复策略 重试次数
网络波动 连接超时、无响应 日志关键词、API超时 重启进程、切换备用池 5
性能骤降 性能<50%预期值持续3分钟 API监控、日志分析 重启进程、清除缓存 3
内存泄漏 内存占用持续增长 定期检查进程内存 主动重启、内存优化 每日1次
配置错误 启动失败、配置文件错误 退出码2、日志关键词 停止并报警、使用默认配置 0
系统资源耗尽 高CPU/内存占用、OOM 系统监控工具 杀死竞争进程、重启系统 2
硬件故障 温度过高、硬件错误 传感器监控、dmesg日志 降频运行、关闭故障设备 1

3.3 高级恢复技术:状态保持与无缝切换

会话状态保存实现(Linux示例):

# 在xmrig_guard.sh中添加状态保存功能
save_session_state() {
    local session_file="/tmp/xmrig_session.json"
    local pid=$1
    
    # 获取当前作业ID和高度
    if curl -s "http://127.0.0.1:3000/1/summary" > "$session_file.tmp"; then
        jq '.job' "$session_file.tmp" > "$session_file"
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] 保存会话状态到 $session_file" >> $LOG_FILE
        rm "$session_file.tmp"
    else
        echo "[$(date +'%Y-%m-%d %H:%M:%S')] 会话状态保存失败" >> $LOG_FILE
    fi
}

# 在健康检查失败时调用
save_session_state $pid

# 重启时恢复状态(需XMRig支持)
xmrig ... --restore-session /tmp/xmrig_session.json

备用池自动切换配置(config.json):

"pools": [
    {
        "url": "xmrpool.eu:3333",
        "user": "YOUR_WALLET_ADDRESS",
        "pass": "x",
        "enabled": true,
        "keepalive": true,
        "tls": false
    },
    {
        "url": "pool.supportxmr.com:5555",
        "user": "YOUR_WALLET_ADDRESS",
        "pass": "x",
        "enabled": true,
        "keepalive": true,
        "tls": false,
        "priority": 1
    },
    {
        "url": "mine.xmrpool.net:5555",
        "user": "YOUR_WALLET_ADDRESS",
        "pass": "x",
        "enabled": true,
        "keepalive": true,
        "tls": false,
        "priority": 2
    }
],
"failover": true,
"failover-retry": 30

四、系统优化与资源管理

4.1 系统优化脚本整合

Linux完整优化脚本 (pre_mining_optimize.sh)

#!/bin/bash -e
# 系统优化脚本 - 提升XMRig稳定性和性能

# 1. 内存优化
echo "设置内存参数..."
sysctl -w vm.swappiness=10
sysctl -w vm.dirty_background_ratio=1
sysctl -w vm.dirty_ratio=5
sysctl -w vm.drop_caches=3

# 2. 启用1GB大页内存
echo "启用1GB大页内存..."
if [ -f "/scripts/enable_1gb_pages.sh" ]; then
    /bin/bash /scripts/enable_1gb_pages.sh
else
    sysctl -w vm.nr_hugepages=$(nproc)
    for i in $(find /sys/devices/system/node/node* -maxdepth 0 -type d); do
        echo 3 > "$i/hugepages/hugepages-1048576kB/nr_hugepages";
    done
fi

# 3. CPU优化
echo "优化CPU设置..."
if [ -f "/scripts/randomx_boost.sh" ]; then
    /bin/bash /scripts/randomx_boost.sh
else
    # 基本CPU优化
    if grep -E 'AMD Ryzen|AMD EPYC|AuthenticAMD' /proc/cpuinfo > /dev/null; then
        echo "应用AMD CPU优化..."
        modprobe msr allow_writes=on
        wrmsr -a 0xc0011020 0
        wrmsr -a 0xc0011021 0x40
        wrmsr -a 0xc0011022 0x1510000
        wrmsr -a 0xc001102b 0x2000cc16
    elif grep "Intel" /proc/cpuinfo > /dev/null; then
        echo "应用Intel CPU优化..."
        modprobe msr allow_writes=on
        wrmsr -a 0x1a4 0xf
    fi
fi

# 4. 网络优化
echo "优化网络设置..."
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_fin_timeout=15

# 5. 关闭不必要服务
echo "关闭不必要服务..."
systemctl stop
登录后查看全文
热门项目推荐
相关项目推荐