1. 首页 > 服务器系统 > Linux

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

列出所有服务_图2

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-managerufwsshdnginxdocker 等)。服务名通常以 .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 -tapachectl 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 信号,使其重新加载配置文件而不中断现有连接。例如 nginxhttpdsshd 都支持 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 的日志摘要更全面。
- 检查服务是否正常响应:结合 curlping 或应用专用健康检查接口,不仅看 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-udevddbus),否则可能导致系统启动异常。在生产环境操作前,建议先在测试环境验证。
  • 兼容性提醒:虽然 systemd 已成为主流,但仍有部分老旧系统使用 SysV init。如果你的环境混合了两种系统,需要区分 service 命令和 systemctl 命令。从 CentOS 6 迁移到 7+ 时,脚本管理需要逐步适配。

总结

本文从 systemd 服务管理的基础命令入手,详细介绍了如何列出服务、启动、停止、重启以及检查状态。同时补充了状态含义、高级命令对比、实用技巧和未来趋势。掌握这些内容后,您已经能够胜任日常的系统服务管理任务。下一步可以深入学习 systemd 单元文件编写、定时器(timer)替代 cron、以及日志管理(journalctl)等高级主题,进一步提升 Linux 系统管理能力。

本文由主机测评网发布,不代表主机测评网立场,转载联系作者并注明出处:https://zhuji.jb51.net/linux/9694.html

联系我们

在线咨询:点击这里给我发消息

Q Q:2220678578