直接看当前运行级别,用who -r最可靠;它不依赖init类型,只读utmp中实时记录,输出明确标出run-level X,如run-level 3表示多用户文本模式,且系统刚启动时仍准确有效。

直接看当前运行级别,用 who -r 最可靠——它不依赖 init 类型,也不管你改没改默认 target,只读 utmp 里此刻的真实记录。
为什么 who -r 是唯一能反映“当前状态”的命令
它输出里明确带 run-level X 字样,X 就是当前实际级别,比如 run-level 3 表示正处在多用户文本模式;
系统刚启动、还没切换过级别时,它依然能返回准确值;
某些容器或最小化系统可能没装 runlevel,但只要用了标准 login + utmp,who -r 就能工作;
不区分 sysvinit 还是 systemd,纯靠内核级登录日志,无兼容性包袱。
runlevel 命令容易误读的两个坑
它输出格式是“上一个 当前”,两个字段空格分隔:
第一个字段常为 N,不是错误,只是表示“自启动后没切换过”;
第二个字段才是当前级别,但新手容易把 N 3 当成“N 级别”或“无效值”;
在 systemd 系统里,runlevel 只是兼容层包装,返回的数字(如 3)可能对应 multi-user.target,但不保证该 target 正在 active;
有些桌面环境会同时激活 multi-user.target 和 graphical.target,这时 runlevel 显示 3,但 GUI 实际在跑——它抓的是依赖链中间态,不是主导模式。
systemctl get-default 查的是默认,不是当前
它只告诉你开机时打算进哪个 target:systemctl get-default 返回 graphical.target → 默认对应运行级别 5,但当前可能是 1 或 3;
手动执行过 systemctl isolate multi-user.target 后,当前已是级别 3,但 get-default 仍显示 graphical.target;
运维排查时拿这个去推断当前状态,轻则误判,重则漏掉服务异常;
真要查当前激活的模式,该用 systemctl list-units --type=target --state=active,看哪个 target 标着 active。
现代 systemd 系统里,“运行级别”本质是 target 映射
传统数字只是别名:runlevel3.target 是指向 multi-user.target 的软链接,runlevel5.target 指向 graphical.target;
真正起作用的是 target 的依赖树和 active 状态,不是数字本身;
想切模式,必须用 systemctl isolate multi-user.target,而不是 init 3 或 telinit 5(后者在纯 systemd 下已失效);/etc/inittab 在 CentOS/RHEL 7+、Ubuntu 16.04+ 中被完全忽略,改它没用。


















