feat(agent): P12 改名 xui-agent——独立二进制文件+改名覆盖+存量迁移清理

install-agent.sh: AGENT_BIN 改 /usr/local/x-ui/xui-agent,下载走 .new 改名
覆盖(agent 自升级不撞 Text file busy),全程不写主控 x-ui 文件;新增
stop_legacy_agent 只精确匹配旧形态 'x-ui agent' 进程(主控裸 x-ui 无参数、
天然不误杀);生成的 systemd/OpenRC 服务改指 xui-agent。仓库 systemd/
x-ui-agent.service 与 openrc/x-ui-agent( procd ) 同步改指;README/docs 的
agent 手动部署段落位改 xui-agent。Go 代码无硬引用、零改动。
fake-root 模拟(systemd/OpenRC/存量重跑)23/23 PASS,见 P12-REPORT.md。
This commit is contained in:
Muse
2026-10-22 09:46:46 +00:00
parent ac39370879
commit 58cdfe73b0
5 changed files with 32 additions and 11 deletions
+26 -5
View File
@@ -7,6 +7,12 @@
# XUI_ROOT 安装路径前缀(假根目录验证用),默认空 = 真实路径
# XUI_INIT_SYSTEM 强制 init 系统: systemd | openrc | none,默认 auto 探测
# XUI_URL agent 二进制下载地址覆盖
#
# 二进制命名(P12 改名):agent 独立装为 /usr/local/x-ui/xui-agent,不再与主控共用
# x-ui 文件——①ps 里进程名即 xui-agent,与主控一眼可辨;②同机部署时 agent 的
# 安装/升级永不写主控文件,不再撞 Text file busy;③进程清理只按 "xui-agent agent"
# 精确匹配 agent 自身。存量旧 agent 的进程形态是 "x-ui agent"(带 agent 子命令),
# 与主控的裸 "x-ui"(无参数)天然可区分,迁移清理只杀前者、绝不误杀主控。
set -e
@@ -44,14 +50,17 @@ XRAY_VER="26.6.27"
ROOT="${XUI_ROOT:-}"
XUI_HOME="${ROOT}/usr/local/x-ui"
CONF_DIR="${ROOT}/etc/x-ui"
AGENT_BIN="${XUI_HOME}/x-ui"
AGENT_BIN="${XUI_HOME}/xui-agent"
info "创建目录..."
mkdir -p "${XUI_HOME}/bin" "${CONF_DIR}"
info "下载 agent 二进制..."
curl -fL -o "${AGENT_BIN}" "$XUI_URL" || error "agent 下载失败"
chmod +x "${AGENT_BIN}"
# 先下到 .new 再改名覆盖:改名是原子替换,正在运行的旧 agent 进程不受影响,
# 也不会因目标文件正被执行而报 Text file busy;全程只写 xui-agent,不碰主控的 x-ui。
curl -fL -o "${AGENT_BIN}.new" "$XUI_URL" || error "agent 下载失败"
chmod +x "${AGENT_BIN}.new"
mv -f "${AGENT_BIN}.new" "${AGENT_BIN}"
info "下载 xray v${XRAY_VER}..."
cd "${XUI_HOME}/bin"
@@ -121,6 +130,15 @@ probe_master() {
probe_master
# 存量迁移清理:旧版脚本把 agent 装在主控文件 x-ui 上(进程形态 "x-ui agent"),
# 重跑本脚本升级时先停掉这类旧进程,服务定义随后会被新单元覆盖。
# 安全边界:只精确匹配带 agent 子命令的旧路径进程;主控是裸 x-ui(无 agent 参数),
# 同机部署时绝不误杀。本脚本任何地方都不写、不删主控文件 x-ui 本身——agent-only
# 节点上它在迁移后成为无用残留,确认该机不跑主控后可人工删除。
stop_legacy_agent() {
pkill -f "${XUI_HOME}/x-ui agent" 2>/dev/null || true
}
detect_init_system() {
case "${XUI_INIT_SYSTEM:-auto}" in
systemd|openrc|none) echo "${XUI_INIT_SYSTEM}"; return;;
@@ -144,7 +162,7 @@ Description=3x-ui agent
After=network.target
[Service]
ExecStart=/usr/local/x-ui/x-ui agent
ExecStart=/usr/local/x-ui/xui-agent agent
Restart=on-failure
RestartSec=5
@@ -157,6 +175,7 @@ EOF
return 0
fi
systemctl stop x-ui-agent 2>/dev/null || true
stop_legacy_agent
pkill -f "${AGENT_BIN} agent" 2>/dev/null || true; sleep 1
systemctl daemon-reload
systemctl enable x-ui-agent
@@ -183,7 +202,7 @@ start_via_openrc() {
name="x-ui-agent"
description="3x-ui lightweight node agent"
command="/usr/local/x-ui/x-ui"
command="/usr/local/x-ui/xui-agent"
command_args="agent"
command_background="yes"
pidfile="/run/x-ui-agent.pid"
@@ -201,6 +220,7 @@ EOF
return 0
fi
rc-service x-ui-agent stop 2>/dev/null || true
stop_legacy_agent
pkill -f "${AGENT_BIN} agent" 2>/dev/null || true; sleep 1
rc-update add x-ui-agent default
rc-service x-ui-agent restart
@@ -221,6 +241,7 @@ EOF
start_via_nohup() {
warn "未检测到 systemd / OpenRC,退回 nohup 方式启动"
warn "注意:nohup 方式没有开机自启,机器重启后 agent 不会自动恢复,需手动重跑本脚本!"
stop_legacy_agent
pkill -f "${AGENT_BIN} agent" 2>/dev/null || true; sleep 1
# -config 显式给出(生产环境即其默认路径 /etc/x-ui/agent.json,行为不变),
# 这样 XUI_ROOT 假根验证时 agent 也能找到刚写下的配置。