2025超强XMRig脚本:7×24小时无间断运行的自动重启与故障恢复方案
你是否曾因进程意外崩溃导致任务中断?是否在凌晨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 脚本架构设计
二、跨平台自动重启实现
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
任务计划程序配置:
- 创建基本任务,触发器设置为"登录时"和"系统启动时"
- 操作选择"启动程序",浏览到批处理文件
- 条件选项卡勾选"唤醒计算机运行此任务"
- 设置选项卡勾选"任务失败时重新启动",最多尝试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 多维度故障检测机制
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
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



