#!/bin/sh # # S89meow_svcd - MeowOS 服务管理器协同启动 + 主机名应用 + 板载服务预置 # # 位置: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级设置」:主机名 + 板载服务配置 # (/usr/data/meow/services.d/,Data 区,首启预置 mdnsd.conf + meow_svc_perf.conf + # meow_svc_power.conf —— 后者为框架专项服务,trigger=boot 恒存在即启动)。 # * **svcd 拉起权**:若 meow_sysui(系统进程总监)已运行 → svcd 由 sysui 监管拉起 # (sysui.d/svcd.conf),本脚本仅在其已运行时 `meow_svcd reload` 让 svcd 补载 mdnsd.conf, # 不重复拉起、不重挂(避免与 sysui 双重监护 svcd)。仅当 **sysui 未运行**时才回退到 # 现网的「重挂循环」自监护(旧固件/无 sysui 场景,向后兼容)。 # # 红线:不 killall、不碰播放器信号、不刷机。svcd 以 -f 前台被 sysui(或重挂循环)拉起; # 服务本身(mdnsd)由 svcd 按 restart=on-fail 托管。 # case "$1" in start) echo -n "Starting meow_svcd (S89): " # 1) 应用主机名:读板载设置 system.hostname(settings.conf),缺省 meowos。 # 须早于 meow_mdns 启动(mdnsd 默认用 gethostname() 公布 .local)。 host="meowos" if [ -f /usr/data/meow/settings.conf ]; then v=$(awk -F= '$1 ~ /^[[:space:]]*system\.hostname[[:space:]]*$/ {gsub(/[[:space:]]/,"",$2); print $2; exit}' /usr/data/meow/settings.conf) [ -n "$v" ] && host="$v" fi # 仅允许 RFC1035 首标签字符(A-Za-z0-9 和 '-'/'.'/'_'),否则回退 meowos case "$host" in ''|*[!A-Za-z0-9_.-]*) host="meowos" ;; esac sethostname "$host" 2>/dev/null || hostname "$host" 2>/dev/null echo -n "host=$host " # 2) 首启预置板载 mdnsd.conf(Data 区可写才建;已存在不覆盖) if [ -d /usr/data/meow ] && [ -w /usr/data/meow ]; then mkdir -p /usr/data/meow/services.d if [ -f /usr/data/meow/services.d/mdnsd.conf ]; then echo -n "mdnsd.conf exists " else cat > /usr/data/meow/services.d/mdnsd.conf <<'EOF' exec=/usr/bin/meow_mdns args= enabled=1 restart=on-fail backoff_ms=2000 max_restart=5 trigger=boot cap= EOF chmod 644 /usr/data/meow/services.d/mdnsd.conf echo -n "provisioned mdnsd.conf " fi else echo -n "skip mdnsd.conf (/usr/data/meow not writable) " fi # 2b) 首启预置板载**专项服务**配置(性能/电源;trigger=boot 恒存在即启动,拔卡保留)。 # perf=on-fail(纯读组,崩即拉起);power=always(系统动作服务应随时可用)。 if [ -d /usr/data/meow ] && [ -w /usr/data/meow ]; then mkdir -p /usr/data/meow/services.d if [ -f /usr/data/meow/services.d/meow_svc_perf.conf ]; then echo -n "perf.conf exists " else cat > /usr/data/meow/services.d/meow_svc_perf.conf <<'EOF' exec=/usr/bin/meow_svc_perf args= enabled=1 restart=on-fail backoff_ms=2000 max_restart=5 trigger=boot cap= EOF chmod 644 /usr/data/meow/services.d/meow_svc_perf.conf echo -n "provisioned perf.conf " fi if [ -f /usr/data/meow/services.d/meow_svc_power.conf ]; then echo -n "power.conf exists " else cat > /usr/data/meow/services.d/meow_svc_power.conf <<'EOF' exec=/usr/bin/meow_svc_power args= enabled=1 restart=always backoff_ms=2000 max_restart=5 trigger=boot cap= EOF chmod 644 /usr/data/meow/services.d/meow_svc_power.conf echo -n "provisioned power.conf " fi else echo -n "skip svc confs (/usr/data/meow not writable) " fi # 3) svcd 拉起权判归:sysui 运行 → 交给 sysui 监管;否则回退重挂循环。 rm -f /tmp/meow_svcd.stop 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 ( while [ ! -f /tmp/meow_svcd.stop ]; do /usr/bin/meow_svcd -f; sleep 1; done ) & echo "started (supervisor pid $!)" fi else echo "MISSING /usr/bin/meow_svcd" fi ;; stop) echo -n "Stopping meow_svcd: " touch /tmp/meow_svcd.stop for p in $(ps | grep "[m]eow_svcd" | awk '{print $1}'); do kill "$p" 2>/dev/null; done echo "OK" ;; restart|reload) ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0