v221 ④ install-agent: OpenWrt/procd support + honest nohup fallback
detect_init_system gains a procd tier ([ -f /etc/rc.common ] && command -v procd, after systemd/OpenRC; XUI_INIT_SYSTEM=procd also accepted). start_via_procd writes /etc/init.d/xui-agent byte-equal to the unit hand-verified on AX6600 (paths via AGENT_BIN/CONF_DIR), stops any previous instance before overwriting, enables + starts, and verifies the process is alive (pgrep, ps fallback). The nohup fallback now errors out immediately and clearly when nohup itself is missing (BusyBox-trimmed systems) instead of pretending to start and failing at the end.
This commit is contained in:
+56
-3
@@ -11,7 +11,7 @@
|
|||||||
#
|
#
|
||||||
# 测试用环境变量(一般无需设置):
|
# 测试用环境变量(一般无需设置):
|
||||||
# XUI_ROOT 安装路径前缀(假根目录验证用),默认空 = 真实路径
|
# XUI_ROOT 安装路径前缀(假根目录验证用),默认空 = 真实路径
|
||||||
# XUI_INIT_SYSTEM 强制 init 系统: systemd | openrc | none,默认 auto 探测
|
# XUI_INIT_SYSTEM 强制 init 系统: systemd | openrc | procd | none,默认 auto 探测
|
||||||
# XUI_URL agent 二进制下载地址覆盖
|
# XUI_URL agent 二进制下载地址覆盖
|
||||||
#
|
#
|
||||||
# 二进制命名(P12 改名):agent 独立装为 /usr/local/x-ui/xui-agent,不再与主控共用
|
# 二进制命名(P12 改名):agent 独立装为 /usr/local/x-ui/xui-agent,不再与主控共用
|
||||||
@@ -220,7 +220,7 @@ stop_legacy_agent() {
|
|||||||
|
|
||||||
detect_init_system() {
|
detect_init_system() {
|
||||||
case "${XUI_INIT_SYSTEM:-auto}" in
|
case "${XUI_INIT_SYSTEM:-auto}" in
|
||||||
systemd|openrc|none) echo "${XUI_INIT_SYSTEM}"; return;;
|
systemd|openrc|procd|none) echo "${XUI_INIT_SYSTEM}"; return;;
|
||||||
esac
|
esac
|
||||||
if [ -d /run/systemd/system ] && command -v systemctl >/dev/null 2>&1; then
|
if [ -d /run/systemd/system ] && command -v systemctl >/dev/null 2>&1; then
|
||||||
echo systemd; return
|
echo systemd; return
|
||||||
@@ -228,6 +228,9 @@ detect_init_system() {
|
|||||||
if command -v rc-update >/dev/null 2>&1 && command -v rc-service >/dev/null 2>&1; then
|
if command -v rc-update >/dev/null 2>&1 && command -v rc-service >/dev/null 2>&1; then
|
||||||
echo openrc; return
|
echo openrc; return
|
||||||
fi
|
fi
|
||||||
|
if [ -f /etc/rc.common ] && command -v procd >/dev/null 2>&1; then
|
||||||
|
echo procd; return
|
||||||
|
fi
|
||||||
echo none
|
echo none
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,9 +325,58 @@ EOF
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 以 procd 服务方式安装并启动(开机自启,OpenWrt)
|
||||||
|
start_via_procd() {
|
||||||
|
local init_dir="${ROOT}/etc/init.d"
|
||||||
|
mkdir -p "$init_dir"
|
||||||
|
# 服务脚本与 2026-10-23 AX6600 真机手工验证版逐字一致(V2.2.1 ④
|
||||||
|
# 收编):路径按脚本变量展开,XUI_ROOT 为空时即验证版的
|
||||||
|
# /usr/local/x-ui/xui-agent 与 /etc/x-ui/agent.json。procd 托管
|
||||||
|
# + respawn 守护,stdout/stderr 进 syslog(logread 查看)。
|
||||||
|
cat > "${init_dir}/xui-agent" <<EOF
|
||||||
|
#!/bin/sh /etc/rc.common
|
||||||
|
START=99
|
||||||
|
STOP=10
|
||||||
|
USE_PROCD=1
|
||||||
|
start_service() {
|
||||||
|
procd_open_instance
|
||||||
|
procd_set_param command ${AGENT_BIN} agent -config ${CONF_DIR}/agent.json
|
||||||
|
procd_set_param respawn 3600 5 5
|
||||||
|
procd_set_param stdout 1
|
||||||
|
procd_set_param stderr 1
|
||||||
|
procd_close_instance
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
chmod +x "${init_dir}/xui-agent"
|
||||||
|
info "已生成 procd 服务文件: ${init_dir}/xui-agent"
|
||||||
|
if [ -n "$ROOT" ]; then
|
||||||
|
info "(XUI_ROOT 模式:跳过 /etc/init.d 实际操作)"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
/etc/init.d/xui-agent stop 2>/dev/null || true
|
||||||
|
stop_legacy_agent
|
||||||
|
pkill -f "${AGENT_BIN} agent" 2>/dev/null || true; sleep 1
|
||||||
|
/etc/init.d/xui-agent enable
|
||||||
|
/etc/init.d/xui-agent start
|
||||||
|
sleep 2
|
||||||
|
if pgrep -f "${AGENT_BIN} agent" >/dev/null 2>&1 || ps w 2>/dev/null | grep "[x]ui-agent agent" >/dev/null 2>&1; then
|
||||||
|
info "agent 已由 procd 托管启动(开机自启)"
|
||||||
|
echo ""
|
||||||
|
echo " 主控: $MASTER"
|
||||||
|
echo " 节点名: $NAME"
|
||||||
|
echo " 日志: logread -f"
|
||||||
|
echo " agent 会在 30 秒内从主控拉取配置"
|
||||||
|
else
|
||||||
|
error "agent 服务启动失败,查看: logread | tail -n 50"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# 无服务管理器时回落 nohup(无开机自启,明确警告)
|
# 无服务管理器时回落 nohup(无开机自启,明确警告)
|
||||||
start_via_nohup() {
|
start_via_nohup() {
|
||||||
warn "未检测到 systemd / OpenRC,退回 nohup 方式启动"
|
# BusyBox 精简系统可能连 nohup 都没有(AX6600 实证):先讲清再退,
|
||||||
|
# 不要假装启动、走到最后才报一个看不懂的失败。
|
||||||
|
command -v nohup >/dev/null 2>&1 || error "未检测到 systemd / OpenRC / procd,且本机无 nohup 命令,无法启动 agent"
|
||||||
|
warn "未检测到 systemd / OpenRC / procd,退回 nohup 方式启动"
|
||||||
warn "注意:nohup 方式没有开机自启,机器重启后 agent 不会自动恢复,需手动重跑本脚本!"
|
warn "注意:nohup 方式没有开机自启,机器重启后 agent 不会自动恢复,需手动重跑本脚本!"
|
||||||
stop_legacy_agent
|
stop_legacy_agent
|
||||||
pkill -f "${AGENT_BIN} agent" 2>/dev/null || true; sleep 1
|
pkill -f "${AGENT_BIN} agent" 2>/dev/null || true; sleep 1
|
||||||
@@ -348,5 +400,6 @@ info "启动 agent..."
|
|||||||
case "$(detect_init_system)" in
|
case "$(detect_init_system)" in
|
||||||
systemd) start_via_systemd;;
|
systemd) start_via_systemd;;
|
||||||
openrc) start_via_openrc;;
|
openrc) start_via_openrc;;
|
||||||
|
procd) start_via_procd;;
|
||||||
*) start_via_nohup;;
|
*) start_via_nohup;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
Reference in New Issue
Block a user