在现代 Linux 系统中,服务管理主要有两种方式:传统的 service 命令和基于 systemd 的 systemctl 命令。
systemd 是目前主流 Linux 发行版(如 CentOS 7+、Ubuntu 16.04+、Debian 8+ 等)采用的初始化系统(init system),用于替代传统的 SysV init 和 Upstart。它的核心设计目标包括:
- 提升系统启动速度:通过并行启动机制,尽可能让多个服务同时启动;
- 按需启动服务:仅在需要时激活服务(例如通过 socket 或 D-Bus 触发);
- 依赖管理更清晰:使用声明式单元(Unit)文件定义服务及其依赖关系;
- 统一管理系统资源:不仅管理服务,还支持挂载点、定时任务、套接字等。
systemd 对应的服务管理命令是 systemctl。值得注意的是,systemctl 在一定程度上兼容传统的 SysV init 脚本:当你运行 systemctl start xxx 而系统中没有对应的 .service 单元文件时,systemd 会尝试在 /etc/init.d/ 目录下查找同名脚本,并以兼容模式执行它。但这只是向后兼容机制。
一、什么是 systemctl?
systemctl 是一个用于检查和控制 systemd 系统和服务管理器的命令行工具。它允许用户启动、停止、重启、启用、禁用服务,以及查看系统状态、日志等。
“注意:大多数 systemctl 操作需要 root 权限或使用 sudo。
二、基本语法
systemctl [选项] [命令] [单元...]
其中“单元”(unit)是 systemd 管理的基本对象,包括:
- 服务单元(.service):服务单元(最常用),如
nginx.service - 定时器单元(.timer):定时任务(类似 cron)
- 目标单元(.target):目标单元(类似传统运行级别,如 multi-user.target)
单元文件的主要存放路径如下:
| |
|---|
/usr/lib/systemd/system/ | 系统默认单元文件(由软件包安装,如 RPM 或 DEB 包)(在 RHEL/CentOS/Fedora 中常见) |
/lib/systemd/system/ | Debian/Ubuntu 系统中通常使用此路径作为默认单元目录 |
/etc/systemd/system/ | 管理员自定义或覆盖的单元文件(优先级最高,推荐用于自定义服务) |
三、常用操作详解
1. 查看服务状态
显示服务是否正在运行、最近的日志、进程 ID、启用状态等信息。
systemctl status crond
我们先通过 crond.service 来观察服务类型 unit 的基本信息:

- Loaded: 描述操作系统启动时会不会启动这个服务,enabled 表示开机时启动,disabled 表示开机时不启动。
- Active:描述服务当前的状态,active (running) 表示服务正在运行中。如果是 inactive (dead) 则表示服务当前没有运行。后面则是服务的启动时间。
关于 unit 的启动状态,除了 enable 和 disable 之外还有:
- static:这个 unit 不可以自己启动,不过可能会被其它的 enabled 的服务来唤醒。
- mask:这个 unit 无论如何都无法被启动!因为已经被强制注销。可通过 systemctl unmask 改回原来的状态。
关于 unit 的运行状态 Active,除了 active 和 inactive 之外还有:
- active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。举例来说,开机或者是挂载时才会进行一次的 quotaon 功能,就是这种模式! Quotaon 不需要一直执行,只在执行一次之后,就交给文件系统去自行处理。通常用 bash shell 写的小型服务,大多是属于这种类型。
- active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。举例来说,打印的相关服务就是这种状态。
2. 启动、停止、重启服务
sudo systemctl start nginx # 启动服务
sudo systemctl stop nginx # 停止服务
sudo systemctl restart nginx # 重启服务
sudo systemctl reload nginx # 重载配置(不中断服务)
“reload 适用于支持热重载的服务(如 Nginx、Apache)。
3. 启用/禁用开机自启
sudo systemctl enable nginx # 开机自动启动
sudo systemctl disable nginx # 禁止开机自动启动
“enable 会在 /etc/systemd/system/ 下创建符号链接;disable 则删除它。
4. 检查服务是否启用或活跃
systemctl is-enabled nginx # 返回 enabled/disabled/static
systemctl is-active nginx # 返回 active/inactive
systemctl is-failed nginx # 检查服务是否失败
这些命令常用于脚本中做条件判断。
四、管理系统整体状态
# 看版本号
systemctl --version
# 列举已经启动的unit
systemctl list-units
# 查找指定的服务
systemctl list-units | grep test.service
# 只看服务
systemctl list-units --type=service
# 查看失败的服务
systemctl list-units --state=failed
# 查看系统上一共装了多个unit,显示所有单元文件及其启用状态(enabled/disabled/static/masked)。
systemctl list-unit-files
# 查看所有的开机启动项
systemctl list-unit-files |grep enabled
# 查看系统启动时间
systemd-analyze
# 显示各服务启动耗时
systemd-analyze blame
五、高级功能
1. 屏蔽(Mask)服务
防止服务被手动或自动启动:
sudo systemctl mask nginx
这会创建一个指向 /dev/null 的符号链接,彻底禁用服务。取消屏蔽:
sudo systemctl unmask nginx
“谨慎使用!屏蔽关键服务可能导致系统异常。
2. 重新加载 systemd 配置
当你修改了服务单元文件(如 /etc/systemd/system/myapp.service),需重载配置:
sudo systemctl daemon-reload
之后才能生效新配置。
3. 查看服务日志(配合 journalctl)
虽然 systemctl status 会显示部分日志,但完整日志应使用:
journalctl -u nginx
journalctl -u nginx -f # 实时跟踪日志
journalctl -u nginx --since today
六、常见目标(Target)操作
target 类似于传统的运行级别(runlevel):
| |
|---|
multi-user.target | |
graphical.target | |
rescue.target | |
poweroff.target | |
reboot.target | |
切换目标:
sudo systemctl isolate multi-user.target
设置默认启动目标:
sudo systemctl set-default graphical.target
查看当前默认目标:
systemctl get-default
七、实用技巧与最佳实践
- 服务命名可省略
.service 后缀
systemctl status nginx 等价于 systemctl status nginx.service
sudo systemctl restart nginx apache2
- 使用 tab 补全
在支持 bash-completion 的系统中,输入 systemctl status ng 后按 Tab 可自动补全服务名。 - 编写自定义服务
将自定义服务文件放在 /etc/systemd/system/(如 myapp.service),然后 daemon-reload 并 enable/start。