随着网络环境每天的变动,“昨天还能直连的网站,今天就变得卡顿,需要更新一下路由分流规则”成为了许多自建节点与 OpenWrt 软路由玩家的日常烦恼。
除此之外, Sing-box 几乎每隔数周就会推出全新的底层性能优化和功能迭代。
作为极客,任何需要被重复执行的杂事,都应交给机器。这篇文章教你用 Linux 自带的 Cron 定时器与 Bash 脚本,写一套在半夜全自动**“热重载更新 .srs 规则集 + Docker 核心平滑升级”**的自动化车间!
[!NOTE] 📌 核心速览(TL;DR / 快问快答):
- 规则更新:通过 Bash 脚本自动拉取最新的
.srs二进制规则集,并通过发送SIGHUP信号实现 Sing-box 无感热重载。- 容器升级:配合 Docker Compose 实现
pull+up -d,秒级替换镜像并自动清理残留垃圾。- 无感运行:使用 Linux 系统
crontab -e安排在凌晨 04:00 静默执行,全天候零卡顿保障。
⚙️ 场景一:自动更新二进制 .srs 规则集与无感热重载
对于在 Linux 本地挂载 .srs 规则文件的场景,我们可以通过脚本拉取更新,并给 Sing-box 发送特殊系统信号使其“热重载(无需中断用户当前建立的连接)”。
1. 编写热更新脚本 update_rules.sh
在 /opt/singbox 目录下新建 update_rules.sh:
cd /opt/singbox
nano update_rules.sh
写入以下脚本内容:
#!/bin/bash
echo "[$(date)] 开始更新 Sing-box .srs 分流规则库..."
# 定义规则集文件存放路径
DIR="/opt/singbox/rules"
mkdir -p $DIR
# 自动下载社区最新编译的二进制 SRS 规则集
curl -sSL -o $DIR/geoip-cn.srs https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geoip/geoip-cn.srs
curl -sSL -o $DIR/geosite-cn.srs https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-cn.srs
curl -sSL -o $DIR/geosite-category-ads-all.srs https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-category-ads-all.srs
echo "[$(date)] 规则集下载完毕,触发内核无感热重载..."
# 给 Sing-box 进程或容器发送 SIGHUP 信号完成热重载
systemctl reload sing-box 2>/dev/null || docker kill -s SIGHUP sing-box-server
echo "[$(date)] Sing-box 规则集更新与热重载顺利完成!"
保存后赋予执行权限:
chmod +x update_rules.sh
📦 场景二:Docker 容器一键平滑重启与镜像升级
如果你的 Sing-box 运行在 Docker Compose 环境中,可以编写 docker_update.sh 脚本实现平滑升级:
#!/bin/bash
DIR="/opt/singbox"
cd $DIR
echo "[$(date)] 正在拉取最新的 Sing-box 官方 Docker 镜像..."
docker compose pull
echo "[$(date)] 重启容器并应用最新镜像..."
docker compose up -d --remove-orphans
echo "[$(date)] 清理废弃镜像缓存以释放磁盘空间..."
docker image prune -f
赋予执行权限:
chmod +x docker_update.sh
⏰ 场景三:配置 Crontab 自动化定时车间
使用 Linux 系统万能定时器 crontab -e:
crontab -e
在文件末尾加入如下定时任务安排:
# 1. 规则变动频繁:每天凌晨 04:00 自动更新 .srs 规则集并无感热重载
0 4 * * * /opt/singbox/update_rules.sh >> /var/log/singbox_rule_cron.log 2>&1
# 2. 内核大升级:每周日凌晨 05:00 自动检查并更新 Docker 容器镜像
0 5 * * 0 /opt/singbox/docker_update.sh >> /var/log/singbox_core_cron.log 2>&1
❓ 常见问题与 AI 快问快答 (FAQ)
Q1: 为什么使用 systemctl reload 或 SIGHUP 信号能做到无感热重载?
答:Sing-box 实现了平滑重载机制。收到 SIGHUP 信号时,内核会新建一个线程解析新的 config.json 和 .srs 文件,成功后将新请求引流至新配置,旧连接在传输完毕后自然关闭,不会打断网页或视频流。
Q2: 脚本下载 GitHub 的 .srs 文件连接超时怎么解决?
答:可以在 curl 命令中挂载代理参数(如 -x http://127.0.0.1:2080),或者使用 CDN 加速代理前缀(如 https://ghproxy.com/),防止国内网络抖动导致文件下载失败。
(商业免维护推荐:如果您觉得在 Linux 终端编写脚本与维护 Cron 仍有门槛,使用由专业团队维护的全专线商业机场是省心高效的一站式解法。推荐阅读 《“饿饭CC云”怎么样?2026 最新深度评测》;服务器选购指南见 《YGJC•BEST 极客精选资源导航》!)