1.0.0 · Paper 1.12.2

LinuxSync

SHUTDOWN SYNC


关服之前,先让数据落地
/xstop 触发 · 7 个模块同步保存 · 一条面板广播

7 个模块 · 同步保存 + 强制备份 · 单条面板播报

01

关服那一刻最容易丢数据

/stop 一敲,Bukkit 开始按顺序禁用插件。 如果某个插件的保存逻辑排在别的插件后面,它读到的可能已经是 被清空的内存状态。LinuxSync 做的就是「先全部落盘,再关服」。

为什么要单独做个插件

XlandStop 是闭源第三方插件,没有源码也无法修改。 但它注册了标准的 /xstop 命令(30 秒倒计时关服), 所以不用改它 —— 监听这条命令即可,零依赖、零侵入。

ITNOL 里本来就有 XStop 监听

ITNOL 的 XStopDetected 只负责记录「谁执行了重启」, 不负责保存数据。LinuxSync 补的正是保存这一环, 两者互不冲突,可以同时存在。

02

三条触发路径

不管是倒计时关机、控制台敲 stop,还是手动测试,都会走同一套同步逻辑。

/xstop

立即同步保存 + 备份 + 广播,然后放行,让 XlandStop 照常走 30 秒倒计时。

stop

拦截(取消原命令)→ 保存 → 广播 → 下一 tick 再真正执行 stop。

/linuxsync

手动触发一次同步,不关服。上线前验证用。

保存清单(全部反射调用,单项失败不影响其它)

插件实际调用
LinuxTeamTeamManager.save() + backupNow() 强制备份
LinuxTitlePlayerDataManager.save()
FakePlayerPluginsaveFakePlayersToYaml()
PointsShopdata().save()
NalxerPDRReportManager.save()
InTheNameOfLinuxBanManager.flush() + PlayTimeManager.save()
LinuxSync无持久化数据,标注「仅内存状态」
03

广播面板

同步完成后只发一条消息(一个多行文本), 样式对齐 ITNOL 的 /linux plugins 面板。

实测输出
═══════════════════════════════════════
  ✦ Linux 数据同步(/linuxsync 触发 · 发起者: Rcon)
  ✦ LinuxTeam          ✔ 队伍已保存 · 备份 teams-20261023-213658-manual.yml
  ✦ LinuxTitle         ✔ 玩家数据已保存
  ✦ FakePlayerPlugin   ✔ 假人数据已保存
  ✦ PointsShop        ✔ 点券数据已保存
  ✦ NalxerPDR         ✔ 举报记录已保存
  ✦ InTheNameOfLinux   ✔ 已保存 封禁·时长(2/2)
  ✦ LinuxSync           ✔ 仅内存状态,无需落盘
  ✦ 结果: 7/7 全部成功 · 耗时 234ms
═══════════════════════════════════════

谁能看到

在线 OP、拥有 xlandstop.stop 权限的玩家、控制台。

备份后缀按来源区分

-xstop / -stop / -manual / -shutdown,一眼看出这次关服是怎么触发的。

04

防止保存死循环

拦截 stop 之后自己又派发 stop,是最容易写出无限循环的地方。三重保险:

① bypassStop

自己 dispatch 之前置 true,派发结束(finally)后复位;监听器第一行就检查它,命中直接放行。

② stopHandled

整个服务器生命周期只拦截一次。第二次再收到 stop 直接放行并继续关服。

③ runTaskLater(1L)

不在命令事件里嵌套派发命令,先让事件处理完毕,下一 tick再 dispatch。

另外:即使同步过程抛异常,也一定继续执行 stop —— 关服不能被保存卡住。耗时超过 15 秒只打警告,不阻塞。

05

部署与限制

三步用起来

  1. 把 LinuxSync-1.0.0.jar 放进 plugins/
  2. 重启服务器,日志出现「LinuxSync 已启用」
  3. 执行 /linuxsync 验证,应看到 7/7

⚠ RCON 的 stop 拦不住

Paper 1.12.2 对 RCON / 原生控制台的 stop 走服务端原生命令处理, 不触发 ServerCommandEvent。所以额外做了 onDisable 兜底保存 —— 任何关服方式都至少落盘一次。

生产建议:关服统一用 /xstop,或直接在控制台敲 stop。

权限
  • linuxsync.use — 使用 /linuxsync(默认 OP)