在 Linux 系统中,服务的启动管理通常由初始化系统负责。当前绝大多数发行版采用 systemd 作为初始化系统,因此本节以 systemd 为主展开。
1. 开机自启:让服务随系统启动
如果某个服务(如 Web 服务器 Nginx、数据库 MariaDB)需要在每次开机时自动运行,可以使用 systemctl enable 命令。
sudo systemctl enable nginx # 设置 nginx 开机自启
这条命令并不立即启动服务,而是在 /etc/systemd/system/ 对应的目标(如 multi-user.target.wants/)下创建一个符号链接,使服务在系统进入该运行级别时自动启动。
如果你不确定一个服务是否已经设置为开机自启,可以用 is-enabled 查询:
systemctl is-enabled nginx
输出 enabled 表示已设置,disabled 表示未设置,static 表示该服务自身不能直接启用(通常是被其他服务拉起的依赖单元)。
要想立即启动服务并同时设为开机自启,可以结合两个命令:
sudo systemctl enable --now nginx
2. 禁用自启:阻止服务开机启动
要取消某个服务的开机自启,使用 systemctl disable:
sudo systemctl disable nginx # 取消 nginx 开机自启
这仅是移除自启的符号链接,不会停止当前正在运行的服务。如果还想立刻停止该服务,需额外执行:
sudo systemctl stop nginx
有时你可能既想禁用服务,又不想让其他服务或手动操作意外启动它,这时可以使用 mask(屏蔽):
sudo systemctl mask nginx
被 mask 的服务甚至无法通过 systemctl start 或自动依赖关系启动,因为它指向 /dev/null。解除屏蔽使用 unmask。
实用技巧:如果你只希望临时停用某个依赖,而不调整自启状态,直接 stop 就好;但如果这个服务是系统中不必再运行的旧项目,最好明确 disable 并可选 mask,以防未来被其他包升级或管理员误启动。
3. 服务依赖管理:定义启动顺序和需求
systemd 通过单元文件(unit file)中的 Requires、Wants、After 和 Before 等指令来管理服务之间的依赖关系。
Requires:强依赖。如果被依赖的单元启动失败,当前单元也会失败。多用于必须一起成功的场景。Wants:弱依赖。被依赖的单元启动失败不影响当前单元的启动结果。推荐用于大部分非关键依赖。After和Before:仅定义启动顺序,不引入依赖关系。比如 “After=network.target” 表示本服务应该在网络启动后启动,但即使网络启动失败,本服务仍会尝试启动(只是可能因无网络而无法正常工作)。
查看和诊断依赖关系:
使用 systemctl list-dependencies 可以展示某个服务的依赖树。
systemctl list-dependencies nginx
默认只显示 Wants 和 Requires 类的依赖,加 --after 或 --before 可显示顺序依赖:
systemctl list-dependencies --after nginx
自定义依赖关系:
当你安装一个需要依赖数据库的应用程序时,其 systemd 服务文件可能包含:
[Unit]
After=mysql.service
Wants=mysql.service
这意味着它希望 MySQL 先于自己启动(After),但即使 MySQL 启动失败,自己也继续启动(Wants)。如果你需要强依赖,可以将 Wants 改为 Requires。
如果你要改写系统自带的单元文件,不要直接修改 /lib/systemd/system/ 下的原始文件(会在包升级时被覆盖)。正确做法是在 /etc/systemd/system/ 下创建同名目录并添加扩展文件,例如:
sudo mkdir -p /etc/systemd/system/nginx.service.d
sudo vi /etc/systemd/system/nginx.service.d/override.conf
在其中添加或覆盖指令,然后执行 sudo systemctl daemon-reload 使更改生效。
通过掌握开机自启、禁用和依赖管理,你就拥有了对 Linux 系统服务生命周期的完整控制力。无论是确保关键服务随系统启动,还是在维护窗口暂停非必要守护进程,这些操作都是系统管理日常里最为基础也最常用的技能。