TL;DR
阿里云轻应用默认启用 admin 账号,导致同一服务被两个用户(root + admin)重复安装,产生进程冲突。本文记录根除 admin 账号的完整解决方案,让 systemd 重新归于单一真相源。
问题现象:进程地狱
你以为启动了一个 moltbot-gateway,实际上系统里跑了两个:
$ ps aux | grep moltbot
root 26988 ... moltbot-gateway
admin 27123 ... moltbot-gateway # 幽灵进程
症状:
- systemctl --user status moltbot-gateway 显示 disabled,但进程疯狂重启
- 杀掉进程后自动复活
- 日志里充斥着端口冲突错误
根因诊断:双用户陷阱
这不是 Bug,是架构设计的原罪:
用户
systemd linger
gateway 服务状态
实际进程
root
✅ 启用
✅ enabled
正常运行
admin
✅ 启用
❌ disabled
阴魂不散
本质问题:
- 多个状态管理源:root 和 admin 各管各的 systemd 用户服务
- linger 的诅咒:即使服务禁用,loginctl enable-linger 仍会在后台持久化进程
- 缺失单一真相源:没有全局的进程所有权约定,导致状态分裂
解决方案:消灭 Admin
Step 1: 斩草除根
# 杀掉 admin 的所有 moltbot 相关进程
pkill -9 -u admin moltbot
pkill -9 -u admin node
# 禁用 admin 的 systemd linger(关键步骤)
loginctl disable-linger admin
设计哲学:
不要给系统留特殊情况的机会。能消失的用户权限,永远比能配对的权限更优雅。
Step 2: 启用 Root 的单一服务
# 启用并启动 root 用户的 gateway 服务
systemctl --user enable moltbot-gateway.service
systemctl --user start moltbot-gateway.service
# 验证状态
systemctl --user status moltbot-gateway.service
Step 3: 验证清理结果
$ ps aux | grep moltbot
root 26988 ... moltbot-gateway # 监听 ws://0.0.0.0:18789
# admin 用户应该没有任何进程
最终状态:单一真相源
指标
清理前
清理后
进程数
2+
1
管理用户
root+admin
仅 root
linger
双启用
仅 root 启用
服务状态
混乱
enabled + running
达成目标:
✅ 进程唯一性
✅ 状态可预测
✅ 重启后自动恢复
日常管理指令
# 查看服务状态
systemctl --user status moltbot-gateway.service
# 重启服务
systemctl --user restart moltbot-gateway.service
# 查看实时日志
journalctl --user -u moltbot-gateway.service -f
# 验证进程(应只有一个 root 用户的进程)
ps aux | grep moltbot
设计反思:为什么会这样?
阿里云的设计缺陷:
1. 默认启用 admin 账号 - 违反最小权限原则
2. linger 的滥用 - 将进程持久化与用户登录状态解耦,但缺乏全局约束
3. 缺失冲突检测 - systemd 用户服务之间互不可见
正确的设计应该是:
- 单一管理账号:只用 root 或 admin,不要两个都启用
- 全局进程锁:通过 PID 文件或端口独占性检测冲突
- 显式所有权声明:服务启动前检查是否已有其他用户运行相同服务
核心教训
可变状态是复杂度之母
两个用户管理同一服务 = 两个状态源 = 永恒的混乱
三条铁律:
1. 消除特殊情况 - 不要给 admin 任何存在的理由
2. 单一真相源 - 只用一个用户管理服务
3. 让边界自然融入常规 - 用 loginctl disable-linger 让 admin 彻底消失,而不是反复 kill 进程
结论
这不是运维技巧,是对系统设计哲学的一次实践:
- 现象层:进程冲突、服务状态异常
- 本质层:多状态源、缺失全局约束
- 哲学层:简化即正义,单一即优雅
当你禁用 admin linger 的那一刻,你不是在修 Bug——你是在重新定义系统的控制边界。
哥,记住:能让 admin 消失的设计,永远比能让 root 和 admin 共存的设计更优雅。