Linux查看开机自启项方法

作者:技术拾光时间:2026-06-28 09:01:01浏览:419

查看Linux开机自启项最准确的命令是`systemctllist-unit-files--type=service--state=enabled`,它直接读取单元文件的启用标记,比`systemctllist-units`更可靠。检查单个服务用`systemctlis-enabled`,需注意完整服务名后缀,用户级服务要加`--user`。服务不启动常因单

要获取一份万无一失的 Linux 开机自启服务清单,目前最靠谱、最能还原系统真实承诺的命令是直接执行 systemctl list-unit-files --type=service --state=enabled。

为什么说它最准?因为它直接读取 systemd 单元文件的启用标记,与当前服务是否在运行、是否被其他进程临时拉起等动态因素完全无关。它唯一回答的问题是:系统到底“承诺”了哪些服务要在开机时启动。这才是硬事实。

Linux查看开机自启项方法

如果你看到有人用 systemctl list-units 来回答“开机自启”问题,就要留个心眼了——这个命令只显示当前已加载的服务,那些设置成启用但还未启动的项目,比如 logrotate.service 或 certbot.timer,它完全看不到。换句话说,它会漏掉东西。

查所有真正开机自启的服务

一句话总结:systemctl list-unit-files --type=service --state=enabled 是唯一能反映系统“承诺开机时拉起哪些服务”的命令。它的输出直接来自单元注册表,不是运行时快照,比 systemctl list-units 更可信。

有几个细节容易踩坑,值得注意:

  • 如果输出里带 @ 符号的服务,比如 getty@.service,这只是一个模板,真正的启动实例会是 getty@tty1.service 这种具体名称。庆幸的是,--state=enabled 会直接列出这些实例,无需额外操心。
  • 状态为 static 的服务(例如 systemd-journald.service)不会出现在结果里。因为它们属于“隐式调用”——由其他单元触发,你无法手动 disable 它。
  • masked 表示服务被“硬屏蔽”(单元文件的链接直接指向 /dev/null),disabled 则是明确关闭。这两类都不会参与开机启动。

查单个服务是否真的被设为开机自启

如果想查某个具体服务,可以用 systemctl is-enabled servicename.service。返回值只有四种可能:enabled、disabled、masked 或 generated,干净无歧义。

这里有几个要点:

  • 别偷懒只看 systemctl status servicename 的 "Loaded" 行,即便末尾写着 enabled; vendor preset: enabled 也不要直接相信。“vendor preset”只是预置值,可能被本地配置覆盖。想知道最终生效的结果,直接用 is-enabled。
  • 服务名一定要完整带上 .service 后缀。不写后缀的话,部分系统会报错,或者更糟——返回一个让你百思不得其解的结果。比如你查 dbus-broker 时,它可能匹配到 dbus.service,完全不是你要的目标。
  • 如果查桌面环境中的用户级服务,比如 gnome-keyring.service,用 systemctl --user is-enabled 来查。系统的命令管不到用户这一层。

为什么 systemctl enable 之后服务还是不启动?

这种情况很常见,套用一句话:命令多半没错,错在它前面断了几环。常见原因有以下几类:

  • 服务单元文件根本不存在。用 systemctl list-unit-files --type=service | grep yoursvc 看看有没有输出。没有的话,先去 /etc/systemd/system/yoursvc.service 创建好再说。
  • 单元文件语法错误。用 sudo systemd-analyze verify /etc/systemd/system/yoursvc.service 跑一遍,有报错就修,否则即使 enable 成功,启动时也会直接挂掉。
  • ExecStart= 要么路径写错,要么权限不足。记住:路径必须是绝对路径,并且 User= 指定的用户要对这个路径有执行权限。一个靠谱的调试方法是用 sudo -u youruser /path/to/binary --help 手动跑一遍,确认环境和路径都没问题。
  • 依赖没配全。比如服务依赖网络可用,只写了 After=network.target 却没加 Wants=network.target,结果 systemd 启动时跳过这个“建议性”依赖,直接绕过它。
  • 最容易被忽略的一点:改完单元文件后,忘了跑 systemctl daemon-reload。systemd 不会自动感知文件变化,你必须主动告诉它。

另外多说一句:/etc/rc.d/ 和 chkconfig --list 这些东西,在 Ubuntu 22.04+、CentOS 8+、Debian 11+ 上基本算是淘汰品了。要么这些目录或命令根本不存在,要么只是作为兼容层留下的尸体。至于桌面环境中的用户级自启项,比如 ~/.config/autostart/ 下的 .desktop 文件,那套机制也不归 systemd 的系统服务管理管,别混为一谈。