人人都会AI编程

17.2 systemctl 服务管理

更新时间:2026-07-12

在现代 Linux 发行版中,systemd 已经成为主流的初始化系统和服管理器,而 systemctl 是与其交互的核心命令。它统一了服务的启动、停止、重启、开机自启配置以及状态查看等操作。本节将用最常用的场景,说明如何管理一个典型的后台服务(例如 nginxsshd)。

1. 查看服务状态
想知道某个服务是不是正在运行,可以使用 status 子命令:

systemctl status nginx

输出中会显示服务是否活动(active (running) 表示运行中)、进程 PID、最近几条日志以及是否启用了开机自启。如果服务挂了,输出通常会给出失败原因。

对于不知道服务确切名字的情况,可以用 list-units 模糊匹配:

systemctl list-units --type=service | grep ssh

2. 启动、停止和重启服务

  • 启动服务sudo systemctl start nginx
  • 停止服务sudo systemctl stop nginx
  • 重启服务sudo systemctl restart nginx
  • 重新加载配置(不中断服务,如果服务支持):sudo systemctl reload nginx

重启和重新加载的区别在于:restart 会完全停止服务再启动,短时间内服务不可用;而 reload 仅仅是让服务重新读取配置文件,进程本身不重启,通常更平滑。不是所有服务都支持 reload,可以用 systemctl show nginx -p CanReload 来判断。

3. 设置开机自启
默认情况下,手动安装的服务并不会随系统启动。要让它开机自启,需要“启用”该服务:

sudo systemctl enable nginx

执行后,systemd 会在正确的运行级别创建符号链接。如果想禁止开机启动,使用:

sudo systemctl disable nginx

可以用 is-enabled 检查服务是否已设为自启:

systemctl is-enabled nginx

4. 查看服务日志
systemd 自带日志系统 journald,用 journalctl 可以查看服务的详细输出:

sudo journalctl -u nginx -n 30      # 最近30行日志
sudo journalctl -u nginx -f          # 实时跟踪输出(类似 tail -f)
sudo journalctl -u nginx --since today   # 查看今天的日志

这对于排查服务启动失败或运行时错误非常实用。

5. 屏蔽和取消屏蔽服务
有些服务你不希望被意外启动(即使作为依赖项),可以“屏蔽”它:

sudo systemctl mask nginx

屏蔽后服务无法被启动或启用。要恢复,执行 unmask

sudo systemctl unmask nginx

6. 重载 systemd 配置
当你自己编写或修改了服务单元文件(如 /etc/systemd/system/myapp.service),需要让 systemd 重新加载配置:

sudo systemctl daemon-reload

然后才能正常启动新服务。

实用场景举例
假设你在服务器上部署了一个 Go 编写的 Web 应用,并为其编写了服务单元文件。典型的管理流程就是:

sudo systemctl daemon-reload                  # 加载新服务
sudo systemctl enable --now myapp            # 启用并立即启动
systemctl status myapp                        # 确认运行
sudo journalctl -u myapp -f                   # 实时看日志

上面的 enable --now 等同于 enable 后再 start,一步到位。

一句话总结
systemctl 提供了清晰且统一的语法来管理各种后台服务,掌握 start/stop/restart/reloadenable/disablestatusjournalctl -u 就足以应对日常运维中的绝大多数服务管理需求。