系统基建线(agent-139): svcd subreaper加固 + meow_sysui总监 + 启动链

- svcd: 审计确认现网已子进程化(fork+execv+setpgid+waitpid+SIGCHLD+set_cloexec,无system()); 增量 prctl(PR_SET_CHILD_SUBREAPER) 代收孤儿孙进程 → fb2d608b
- meow_sysui(新增): 系统进程总监, 仿svcd成熟模式(信号自管道/poll/双探测kill/waitpid/subreaper/状态机), 监护自己fork+exec进程, 按sysui.d/<name>.conf逐条拉起, 无级联/有限次兜底/主循环绝不exit/空配置空转 → 173013cc
- 启动链 S70meow_sysui → S89meow_svcd → S90meow_bootmenu; svcd拉起权判归(sysui在→交监管,不在→回退现网重挂循环)
- 宿主集成测试过(常崩/稳定隔离/无级联/subreaper收尸/端到端); meow_ui.a未动
- 需加到固件打包(build_fw_apps_m267.sh): sysui→/usr/bin/meow_sysui, svcd覆盖(fb2d608b), S70+S89; 校验 svcd 762e84d0→fb2d608b, 新增 sysui 173013cc
This commit is contained in:
MeowOS committed 2026-08-30 19:07:47 +08:00
1 parent c4e648be0e
commit 2a6c4e97c5
9 files changed
+1391 -8

No files matched your search

+28 -8
View File
@@ -1,16 +1,19 @@
#!/bin/sh
#
# S89meow_svcd - MeowOS 服务管理器开机自启 + 主机名应用 + 板载服务预置
# S89meow_svcd - MeowOS 服务管理器协同启动 + 主机名应用 + 板载服务预置
#
# 位置:S84ssh 之后、S90meow_bootmenu 之前(S80 < S84 < S89 < S90)。
# 位置:S70meow_sysui 之后、S90meow_bootmenu 之前(S70 < S84 < S89 < S90)。
# * rcS 顺序执行 /etc/init.d/S??*,而 S90meow_bootmenu 里 `exec /usr/bin/meow_bootmenu
# --fork` 会阻塞 rcS(选单后 exec meow_launcherd 或 fork 播放器监督),故任何 S90
# 之后的 init.d(如 S91/S92)**都不会执行**——svcd 必须排在 S90 之前。
# * 本脚本只装「稳定框架/KB级设置」:meow_svcd(固件 /usr/bin/)+ 板载服务配置
# (/usr/data/meow/services.d/,Data 区,首启预置 mdnsd.conf)+ 应用主机名。
# * 本脚本只装「稳定框架/KB级设置」:主机名 + 板载服务配置
# (/usr/data/meow/services.d/,Data 区,首启预置 mdnsd.conf)。
# * **svcd 拉起权**:若 meow_sysui(系统进程总监)已运行 → svcd 由 sysui 监管拉起
# (sysui.d/svcd.conf),本脚本仅在其已运行时 `meow_svcd reload` 让 svcd 补载 mdnsd.conf,
# 不重复拉起、不重挂(避免与 sysui 双重监护 svcd)。仅当 **sysui 未运行**时才回退到
# 现网的「重挂循环」自监护(旧固件/无 sysui 场景,向后兼容)。
#
# 红线:不 killall、不碰播放器信号、不刷机。svcd 以 -f 前台被本脚本重挂循环拉起
#(失败降级不死——若 svcd 死,其所托管服务已是独立子进程、被 init 收养继续运行);
# 红线:不 killall、不碰播放器信号、不刷机。svcd 以 -f 前台被 sysui(或重挂循环)拉起;
# 服务本身(mdnsd)由 svcd 按 restart=on-fail 托管。
#
case "$1" in
@@ -54,9 +57,26 @@ EOF
echo -n "skip mdnsd.conf (/usr/data/meow not writable) "
fi
# 3) 拉起 meow_svcd(-f 前台,重挂循环防死;/tmp/meow_svcd.stop 标记防停循环)
# 3) svcd 拉起权判归:sysui 运行 → 交给 sysui 监管;否则回退重挂循环。
rm -f /tmp/meow_svcd.stop
if [ -x /usr/bin/meow_svcd ]; then
sysui_alive=0
if [ -x /usr/bin/meow_sysui ] && ps | grep -q "[m]eow_sysui"; then
sysui_alive=1
fi
if [ "$sysui_alive" = "1" ]; then
# svcd 由 meow_sysui 监管拉起;此处仅补载刚预置的 mdnsd.conf(若 svcd 已在跑)
if [ -x /usr/bin/meow_svcd ]; then
if [ -f /tmp/meow_svcd.pid ] && kill -0 "$(cat /tmp/meow_svcd.pid 2>/dev/null)" 2>/dev/null; then
/usr/bin/meow_svcd reload 2>/dev/null
echo -n "supervised by sysui (svcd running, reload) "
else
# svcd 未在跑:交给 sysui 按兜底(有限次重试)拉起,此处不干预,防双重拉起
echo -n "defer to meow_sysui (svcd down) "
fi
else
echo -n "MISSING /usr/bin/meow_svcd "
fi
elif [ -x /usr/bin/meow_svcd ]; then
if [ -f /tmp/meow_svcd.pid ] && kill -0 "$(cat /tmp/meow_svcd.pid 2>/dev/null)" 2>/dev/null; then
echo "already running"
else
Binary file not shown.
+6
View File
@@ -66,6 +66,7 @@
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/prctl.h>
#include <poll.h>
/* ---- 默认路径 / 常量 ---- */
@@ -1143,6 +1144,11 @@ static void shutdown_all(void)
static int start_daemon(void)
{
if (setup_signals() != 0) return 1;
/* 设为子进程回收者:被监管服务若派生出孙进程,在服务(直接子进程)退出后
* 由 svcd 收尸而非 reparent 到 init,强化「服务崩溃隔离(僵死/孤儿)」一环。
* 失败不致命:仅记录并继续。 */
if (prctl(PR_SET_CHILD_SUBREAPER, 1) != 0)
svcd_log("PR_SET_CHILD_SUBREAPER failed: %s (continue)", strerror(errno));
if (setup_socket() != 0) return 1;
write_pidfile();
+2
View File
@@ -128,6 +128,8 @@ FAILED 崩溃且不再重启(超 max_restart / restart=never)
- **不读服务输出**:子进程继承 svcd stdio(stdout/stderr 落同一 sink),svcd **不
设管道读服务体**——服务写多少都不进 svcd 内存,天然规避「输出撑爆 → svcd 崩」。
- **后退避**:重启间隔受 `backoff_ms` 约束,防崩溃-重启热循环拖垮系统。
- **孤儿/僵死隔离**:`start_daemon()` 设 `PR_SET_CHILD_SUBREAPER`——服务若派生孙进程,
在服务(直接子进程)退出后由 svcd 收尸而非 reparent 到 init,避免游离/僵死进程;失败仅记日志继续。
- 服务崩**绝不**连带 supervisor:svcd 是 supervisor 的子进程且自身不死;服务是
svcd 的子进程,服务死只影响 svcd 内部一张表。