Linux systemctl命令怎么用?详解启动停止重启服务及状态检查
我从 systemd 开始,因为它被广泛接受。systemd 是当今大多数主流 Linux 发行版(如 RHEL、CentOS、Fedora、Ubuntu 16.04+、Debian 8+、openSUSE 等)默认的初始化系统(init system)和服务管理器。它不仅负责系统启动后的第一个进程(PID 1),还提供了强大的服务管理能力,替代了传统的 System V init 脚本。systemd 的核心优势在于并行启动服务、按需启动守护进程、以及统一的日志管理(journald)。掌握 systemd 的服务管理命令 systemctl,是每个 Linux 系统管理员和开发者的必备技能。
1、列出所有服务
为了管理服务,你首先需要知道系统上有哪些服务可用。你可以使用 systemd 的命令列出 Linux 系统上的所有服务:
systemctl list-unit-files --type service -all

systemctl list-unit-files
此命令将输出所有服务的状态。服务状态有启用(enabled)、禁用(disabled)、屏蔽(masked,在取消屏蔽之前处于非活动状态)、静态(static)和已生成(generated)。下面我们详细解读这几种状态的含义:
- enabled(已启用):服务已设置开机自启动,系统启动时会自动运行该服务单元。
- disabled(已禁用):服务不会开机自启动,但可以手动启动。
- masked(已屏蔽):服务被强制“屏蔽”,无法启动(无论是手动还是开机),直到解除屏蔽。这通常用于彻底禁止某个服务运行,防止被意外触发。
- static(静态):服务单元文件本身没有定义
[Install]段,不能通过enable/disable控制开机自启,通常作为其他服务的依赖项被间接调用。 - generated(已生成):该服务单元文件是由系统动态生成(例如通过 systemd-generator 工具),而不是静态存在于磁盘上的。
📌 专家建议:在日常运维中,
list-unit-files展示的是所有已安装服务单元文件的状态,但如果你只想看当前正在运行的服务,建议使用systemctl list-units --type=service --state=running,它会更直观地显示活动服务的实时状态。
与 grep 命令结合,你可以仅显示正在运行的服务:
sudo systemctl | grep running

Display running services systemctl
补充扩展:除了
grep,你还可以使用systemctl list-units --type=service --state=running直接过滤出运行中的服务,无需管道。两种方法各有优劣:grep更灵活,但--state参数更规范且性能更好。另外,如果想查看所有已加载的服务单元(包括非运行状态),可用systemctl list-units --type=service,它默认只显示加载到内存中的单元,而list-unit-files则显示磁盘上所有单元文件的状态,两者侧重点不同。
现在,你知道了如何引用所有不同的服务,你可以开始主动管理它们。
注意: 下列命令中的 <service-name> 应该用你想管理的服务名代替(比如:network-manager、ufw、sshd、nginx、docker 等)。服务名通常以 .service 结尾,但在 systemctl 命令中可以省略后缀(如 systemctl start sshd 等同于 systemctl start sshd.service)。建议尽量使用完整名称以避免歧义。
2、启动服务
要在 Linux 中启动服务,你只需使用它的名字:
systemctl start <service-name>
📘 知识普及:
systemctl start命令会立即启动服务进程,但不会更改服务的开机自启设置。如果服务已经处于运行状态,该命令通常不会报错(幂等性),但会重新触发服务的启动逻辑(例如重新加载配置,取决于服务单元的类型)。对于某些服务(如nginx),start会正常启动;对于socket激活的服务,start可能只是激活对应的 socket 监听。
注意事项:
- 启动服务前,建议先用 systemctl status <service-name> 查看当前状态,避免重复启动。
- 如果服务启动失败,可以使用 journalctl -u <service-name> -xe 查看详细的日志错误信息,这比直接看 status 输出更详尽。
- 某些服务依赖环境变量或配置文件,启动前请确保配置文件语法正确(例如 nginx -t 或 apachectl configtest)。
3、停止服务
要停止 systemd 服务,可以使用 systemctl 命令的 stop 选项:
systemctl stop <service-name>
💡 补充说明:
stop会向服务的主进程发送 SIGTERM 信号,请求正常终止。如果服务无法优雅关闭,systemd 会等待超时时间(默认 90 秒)后强制 SIGKILL。你可以通过修改服务单元文件中的TimeoutStopSec来调整这一时间。另外,停止服务不会影响其开机自启状态,即enabled的服务停止后,下次重启仍会自动启动。
对比表格:停止 vs 禁用 vs 屏蔽
| 操作 | 命令 | 当前运行状态 | 开机自启状态 | 是否可手动启动 |
|---|---|---|---|---|
| 停止 | systemctl stop | 变为停止 | 不变(仍可能 enabled) | 可以 |
| 禁用 | systemctl disable | 不变(运行中继续运行) | 变为 disabled | 可以 |
| 屏蔽 | systemctl mask | 不变(但会阻止启动) | 变为 masked | 不可以(除非 unmask) |
| 停止+禁用 | systemctl disable --now | 停止 | 变为 disabled | 可以 |
| 停止+屏蔽 | systemctl mask --now | 停止 | 变为 masked | 不可以 |
专家建议:如果希望服务彻底不运行且无法被其他服务唤醒,建议使用
mask而非仅stop。但注意,屏蔽关键系统服务(如systemd-logind)可能导致系统异常,操作前需确认服务用途。
4、重启服务
要重启 systemd 服务,可以使用:
systemctl restart <service-name>
🔄 重启的两种变体:
-systemctl restart <service>:会先执行停止再启动,无论服务当前是否运行。常用于应用配置更新后重新加载。
-systemctl reload <service>(部分服务支持):向服务进程发送 SIGHUP 信号,使其重新加载配置文件而不中断现有连接。例如nginx、httpd、sshd都支持reload。如果服务不支持reload,系统会提示该操作不支持,此时应使用restart。
何时使用 restart vs reload?
- 生产环境中,对于需要保持长连接的服务(如 Web 服务器、数据库),优先使用 reload 以避免连接中断。
- 如果服务配置改动较大或需要重新初始化资源,则使用 restart。
- 注意:reload 不是所有服务都支持,可以先执行 systemctl help <service> 或查阅服务文档确认。
5、检查服务状态
你可以通过打印服务状态来确认你已经成功执行特定操作:
systemctl status <service-name>
这将以以下方式输出:

systemctl status
🔍 状态输出详解:
systemctl status的输出通常包含以下关键信息:
- 服务名称和描述:单元文件的简短描述。
- Loaded:单元文件路径、是否已加载,以及启用状态(enabled/disabled/static/masked)。
- Active:当前激活状态(active/running、inactive/dead、failed)以及启动时间。
- Processes:主进程 PID 及相关子进程。
- CGroup:控制组信息,显示该服务所属的资源控制层次。
- 日志摘要:最近几条日志消息(默认显示最后 10 行),方便快速排错。
实用技巧:
- 持续监控状态变化:使用 systemctl status -f <service> 或 watch -n 2 systemctl status <service> 实时刷新。
- 查看完整日志:journalctl -u <service-name> -f 可以跟踪实时日志输出,比 status 的日志摘要更全面。
- 检查服务是否正常响应:结合 curl、ping 或应用专用健康检查接口,不仅看 systemd 状态,还要验证业务功能。
延伸知识:systemd 服务管理的高级操作
除了上述基础命令,systemd 还提供了许多实用的服务管理操作:
| 操作目的 | 命令示例 | 说明 |
|---|---|---|
| 启用开机自启 | systemctl enable <service> | 创建符号链接到 multi-user.target 等 |
| 禁用开机自启 | systemctl disable <service> | 移除符号链接 |
| 屏蔽服务 | systemctl mask <service> | 链接到 /dev/null,完全阻止启动 |
| 取消屏蔽 | systemctl unmask <service> | 恢复服务单元文件 |
| 重新加载 systemd 配置 | systemctl daemon-reload | 修改了 .service 文件后需执行 |
| 查看服务依赖树 | systemctl list-dependencies <service> | 显示该服务依赖的其他单元 |
| 查看服务环境变量 | systemctl show <service> --property=Environment | 常用于调试环境问题 |
未来趋势与注意事项
- systemd 的持续演进:systemd 仍在积极开发,新版本增加了更多安全特性(如动态用户、沙盒限制、内存保护等)。未来服务管理将更强调声明式配置和可观测性。
- 容器化时代的服务管理:在 Kubernetes 和容器编排盛行的今天,systemd 仍然在主机层扮演重要角色。对于容器内的服务,建议使用轻量级 init 进程(如 tini、dumb-init),但 systemd 依然是物理机和虚拟机主流选择。
- 安全建议:不要随意
mask系统关键服务(如systemd-udevd、dbus),否则可能导致系统启动异常。在生产环境操作前,建议先在测试环境验证。 - 兼容性提醒:虽然 systemd 已成为主流,但仍有部分老旧系统使用 SysV init。如果你的环境混合了两种系统,需要区分
service命令和systemctl命令。从 CentOS 6 迁移到 7+ 时,脚本管理需要逐步适配。
总结
本文从 systemd 服务管理的基础命令入手,详细介绍了如何列出服务、启动、停止、重启以及检查状态。同时补充了状态含义、高级命令对比、实用技巧和未来趋势。掌握这些内容后,您已经能够胜任日常的系统服务管理任务。下一步可以深入学习 systemd 单元文件编写、定时器(timer)替代 cron、以及日志管理(journalctl)等高级主题,进一步提升 Linux 系统管理能力。
本文由主机测评网发布,不代表主机测评网立场,转载联系作者并注明出处:https://zhuji.jb51.net/linux/9694.html
