
为什么开机自动重连值得单独成篇
在服务器、树莓派或矿机里,快连Linux命令行一旦掉线,人工 SSH 上去敲 kuailian-cli reconnect 既低效又可能错过关键任务。把重连做成「开机即自愈」的守护单元,可把故障窗口压到分钟级,同时让 CI/CD、爬虫、跨境同步脚本免于中断。
然而 Linux 发行版初始化机制差异大:Ubuntu 22/24 默认 systemd,Debian 11 仍兼容 rc.local,而 NAS 固件往往阉割 systemd。本文用「问题—约束—解法」的工程师视角,先给出决策树,再落地下述三条主流路径,并附上回退与观测方法,确保你 10 分钟内可复现、可回滚。
路径选择决策树:systemd、crontab、rc.local 怎么挑
1. 看系统版本
执行 ps --no-headers -o comm 1,输出 systemd 则优先 systemd;输出 init 再检查 /etc/inittab 是否存在,存在则考虑 rc.local;crontab 作为兜底,任何发行版都可用,但缺少依赖顺序控制。
2. 看依赖需求
若重连前必须等网络-online 或 Docker 网络就绪,systemd 的 After=network-online.target 最稳;crontab 的 @reboot 不保证网络已通,需自写重试;rc.local 介于两者之间,但日志分散。
3. 看维护成本
systemd 一次写好可随软件包升级自动 reload;crontab 需要 root 或个人 crontab 分开维护;rc.local 在新版系统常被默认禁用,需手动 chmod +x 与 enable 操作,长期可维护性最差。
提示:若机器由多人共享,建议 systemd 单元放 /etc/systemd/system,统一 root 管控,避免个人 crontab 被误删。
方案 A:systemd 守护单元(推荐)
步骤 1:准备调用脚本
创建 /opt/kuailian/reconnect.sh,内容如下,确保退出码能被 systemd 识别:
#!/bin/bash /usr/local/bin/kuailian-cli status || /usr/local/bin/kuailian-cli connect cn-guangzhou-01 exit $?
赋权 chmod 755 /opt/kuailian/reconnect.sh。
步骤 2:编写单元文件
新建 /etc/systemd/system/kuailian-reconnect.service:
[Unit] Description=Kuailian privacy tool Keep-alive & Reconnect After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=/opt/kuailian/reconnect.sh Restart=on-failure RestartSec=30 User=root StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
步骤 3:启用与验证
systemctl daemon-reloadsystemctl enable --now kuailian-reconnect.servicesystemctl status kuailian-reconnect观察 Active: active (running)- 手动 kill kuailian-cli 进程,30 秒内应被 systemd 重新拉起。
边界注意:若节点标签写错,脚本会永远返回非 0,导致无限重启。建议先在命令行跑一次确认 exit 0。
方案 B:@reboot crontab 轻量法
适用场景
NAS、WSL1、容器镜像等精简环境,systemd 不可用或用户无 root。
操作步骤
- 执行
crontab -e - 写入
@reboot sleep 30 && /opt/kuailian/reconnect.sh >>/tmp/kuailian-cron.log 2>&1 - 保存退出,重启测试。
sleep 30 是经验性观察:WSL1 网络栈初始化滞后,若过早调用会提示「Network unreachable」。
回退与观测
crontab 不提供原生重试,可在脚本内加循环:
until kuailian-cli status; do kuailian-cli connect cn-guangzhou-01 sleep 60 done
日志落盘到 /tmp,需配合 logrotate 或手动清理,防止长期写入撑满 tmpfs。
方案 C:rc.local 兼容兜底
启用流程
- 检查 /etc/rc.local 是否存在且可执行;若不存在则新建。
- 加入
/opt/kuailian/reconnect.sh &,注意放后台避免阻塞启动。 chmod +x /etc/rc.local- 若系统使用 systemd,可额外执行
systemctl enable rc-local.service确保兼容层生效。
缺点说明
rc.local 失败不会自动重试,也不产生结构化日志;一旦脚本阻塞,可能拖慢整个启动序列。仅建议在老旧发行版或嵌入式固件临时过渡。
验证与观测:如何确认真的重连成功
指标 1:IP 出口变化
在重连脚本尾部追加:
curl -s https://api.ip.sb/ip > /var/log/kuailian-ip.log
每次切换后比对地址,若与预期节点城市一致则判定成功。
指标 2:systemd 自带计数
执行 systemctl show kuailian-reconnect -p NRestarts,若数字持续增长说明脚本不断异常退出,需检查节点名或本地防火墙。
指标 3:持续丢包探测
可并行跑一个 systemd timer,每 5 分钟 ping 1.1.1.1 30 次,丢包率>50% 时主动 systemctl restart kuailian-reconnect,形成外环自愈。
常见故障排查表
| 现象 | 可能原因 | 验证命令 | 处置 |
|---|---|---|---|
| systemctl 启动失败 | 脚本无执行权限 | namei -l /opt/kuailian/reconnect.sh | chmod 755 |
| 日志提示 "Network unreachable" | 启动时网络未就绪 | journalctl -b | grep network | 加 After=network-online.target |
| 节点切换后无出口流量 | 路由表残留 | ip rule show | kuailian-cli disconnect && reconnect |
| crontab 日志空白 | 环境变量缺失 | which kuailian-cli | 脚本内写绝对路径 |
进阶:与 Docker、CI 协同
若重连后需重启依赖容器,可在 systemd 单元追加 ExecStartPost=docker restart myapp;但注意「网络命名空间」隔离,建议把 kuailian-cli 跑在宿主机,容器通过 --network host 或代理环境变量指向 127.0.0.1:1080,避免容器内重复拨号。
不适用场景与合规提醒
- 公司内网若禁止第三方 TUN 驱动,需先申请白名单,否则 systemd 无限重启会被 IDS 标记为异常进程。
- 在共享矿场,若机器镜像来自上游厂商,/usr/local/bin 可能被只读挂载,此时需把可执行文件改放 /opt 并调整单元内路径。
- 教育网 802.1x 认证前网络处于隔离域,开机 30 秒内 network-online.target 可能永远达不到,需改用 crontab + 人工延迟。
最佳实践速查表
- 优先 systemd,日志集中,失败可自动重试。
- 脚本必须返回 0,非 0 视为异常。
- 节点名先手动验证,再写死到脚本,避免拼写错误导致无限重启。
- 每次升级 kuailian-cli 后执行
systemctl daemon-reload,防止单元缓存旧路径。 - 每季度 review 一次 IP 出口日志,确认节点池未下架。
FAQ(结构化数据)
WSL2 能用 systemd 方案吗?
截至当前最新版本,Windows 11 24H2 已支持 WSL2 systemd,只需在 /etc/wsl.conf 加 [boot] systemd=true,随后按本文 systemd 步骤操作即可;若用 WSL1 请退回 crontab。
rc.local 里放后台 & 符号,日志去哪看?
输出被重定向到 /dev/null,需在命令后手动追加 >>/var/log/rc-local.log 2>&1,并确保该文件可写;否则失效信息无法追溯。
能否同时跑多条节点做负载?
kuailian-cli 单进程只维护一条隧道,若需多出口请开多个配置目录与端口,配合 ip rule 分流;但 systemd 需分别写单元,注意端口冲突。
开机自启会影响手动断连吗?
systemd 只在检测到非 0 退出码时重启,若你手动执行 kuailian-cli disconnect 后脚本返回 0,则不会再次自动连;需要连时再 systemctl start 即可。
收尾与下一步
至此,你已掌握三条主流开机自启路径的完整落地与回退方法。建议先在测试机复现,确认日志无异常后再推生产;随后把「节点名称」「重试间隔」写成变量,存进 /etc/default/kuailian,方便日后批量替换。最后,把本文最佳实践速查表贴到团队 Wiki,下次系统迁移可 3 分钟完成切换。
📺 相关视频教程
UFW防火墙使用配置|保护VPS服务器 | Ubuntu22.04