精通 systemctl:Linux 服务管理的基本命令
管理服务是维护任何现代 Linux 发行版的基石。自 systemd 采用以来,systemctl 命令已成为与系统和服务管理器交互的通用工具。无论您是部署新应用程序、排除故障还是确保服务在启动时正确启动,掌握 systemctl 对于高效的系统管理都至关重要。
本指南提供了管理 Linux 系统上服务状态、启动行为和状态所需的基本 systemctl 命令的全面概述。我们将介绍最常用于控制服务生命周期和确保系统稳定性的命令。
理解 systemd 和 systemctl
systemd 是大多数主要 Linux 发行版(如 Debian、Ubuntu、CentOS/RHEL、Fedora)使用的初始化系统和服务管理器。它负责初始化用户空间并管理进程、会话和系统服务。
systemctl 是用于控制和检查 systemd 管理器及其组件(单元)状态的主要命令行实用程序。服务,即在后台运行的程序(守护进程),被管理为服务单元(通常以 .service 结尾)。
关键概念:单元和目标 (Units and Targets)
虽然本文重点介绍服务,但请记住 systemctl 管理各种单元:
- 服务单元 (
.service):用于管理后台进程(例如nginx.service)。 - 目标单元 (
.target):用于将单元分组在一起以表示特定的系统状态(例如multi-user.target,代表典型的服务器环境)。
服务控制的基本命令(运行时状态)
这些命令直接控制服务在当前活动会话中是正在运行还是已停止。
1. 启动服务
使用 start 命令立即启动服务,无论其启动配置如何。
sudo systemctl start <service_name>.service
# 示例:启动 Apache Web 服务器
sudo systemctl start apache2.service
2. 停止服务
使用 stop 命令可以优雅地终止正在运行的服务。
sudo systemctl stop <service_name>.service
# 示例:停止 MySQL 数据库服务
sudo systemctl stop mariadb.service
3. 重启服务
更改配置文件后通常使用此命令。它会停止服务,然后立即重新启动它。
sudo systemctl restart <service_name>.service
# 示例:重启 SSH 守护进程
sudo systemctl restart sshd.service
4. 重新加载配置
许多服务支持重新加载 (reload) 操作,该操作可以在不中断现有连接或完全停止进程的情况下应用新的配置文件。这比完全重启更快,干扰性更小。
sudo systemctl reload <service_name>.service
# 示例:重新加载 Nginx 配置
sudo systemctl reload nginx.service
提示: 始终检查服务文档。如果服务不支持
reload,则在更改配置后必须使用restart。
服务持久性的基本命令(启动状态)
启动服务使其立即运行,而启用或禁用它则控制它在系统启动时是否会自动启动。
1. 启用服务
要确保服务在重启后自动启动,您必须启用 (enable) 它。这会在 systemd 配置目录 (/etc/systemd/system/) 中创建必要的符号链接。
sudo systemctl enable <service_name>.service
# 示例:启用 PostgreSQL 在启动时启动
sudo systemctl enable postgresql.service
2. 禁用服务
要防止服务在启动时自动启动,您必须禁用 (disable) 它。这会删除 enable 命令创建的符号链接。
sudo systemctl disable <service_name>.service
# 示例:在服务器上禁用蓝牙服务
sudo systemctl disable bluetooth.service
3. 屏蔽服务(终极选项)
屏蔽 (mask) 单元会阻止它被手动、自动或通过任何其他单元依赖关系启动。这通常用于永久禁用与另一个组件冲突的系统组件,即使标准的 disable 命令不足以达到目的。
sudo systemctl mask <service_name>.service
# 要撤销屏蔽:
sudo systemctl unmask <service_name>.service
检查服务状态和信息
了解服务是否正在运行以及它为何可能失败,对于故障排除至关重要。
1. 检查状态
status 命令提供服务的详细、即时快照,包括它是否处于活动状态、已加载、其进程 ID 以及最近的日志条目。
systemctl status <service_name>.service
# 示例:检查防火墙状态
systemctl status firewalld.service
解释输出:
请注意输出中的三个关键行:
- Loaded (已加载): 显示单元文件是否已正确加载(例如
loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled))。 - Active (活动): 显示当前的运行时状态(例如
active (running)或failed)。 - CGroup: 显示与服务关联的进程树。
2. 查询启动持久性
您可以检查服务是否配置为自动启动,而无需查看完整的状态输出:
systemctl is-enabled <service_name>.service
# 输出将是 'enabled'(已启用)、'disabled'(已禁用)或 'masked'(已屏蔽)
3. 使用 journalctl 查看日志
虽然 status 显示最后几行输出,但对于深入调试,您必须使用 journalctl。此命令会查询 systemd 日志 (journal),该日志收集所有系统和服务日志。
要查看特定于服务的日志:
# 查看服务自上次重启以来的所有日志
journalctl -u <service_name>.service
# 实时查看日志(类似于 tail -f)
journalctl -u <service_name>.service -f
# 查看自昨天以来的日志
journalctl -u <service_name>.service --since "yesterday"
警告: 如果服务显示
failed状态,journalctl -u <service> -r(反向顺序,最新日志在前)通常是查看导致失败的错误消息的最快方法。
管理系统状态(目标)
systemctl 也用于通过目标 (targets) 管理全局系统状态。
1. 查看当前系统状态
要查看系统当前启动到哪个目标(例如服务器环境或图形桌面):
systemctl get-default
2. 更改默认启动目标
如果您正在配置一台永远不应启动 GUI 的服务器,可以将默认目标设置为 multi-user.target:
sudo systemctl set-default multi-user.target
3. 重启和关机
虽然 reboot 和 shutdown 命令仍然有效,但 systemctl 提供了执行这些操作的本机方式:
# 立即重启系统
sudo systemctl reboot
# 挂起系统(断电)
sudo systemctl poweroff
基本 systemctl 命令摘要
| 操作 | 命令语法 | 目的 |
|---|---|---|
| 立即启动 | sudo systemctl start name.service |
立即运行服务。 |
| 立即停止 | sudo systemctl stop name.service |
终止正在运行的服务。 |
| 重启 | sudo systemctl restart name.service |
停止然后重新启动服务。 |
| 重新加载 | sudo systemctl reload name.service |
应用配置更改,无停机时间(如果支持)。 |
| 启用 | sudo systemctl enable name.service |
配置服务以便在启动时启动。 |
| 禁用 | sudo systemctl disable name.service |
防止服务在启动时启动。 |
| 状态 | systemctl status name.service |
检查运行时状态和最近的日志。 |
| 查看日志 | journalctl -u name.service |
访问服务的完整 systemd 日志历史记录。 |
掌握这些核心 systemctl 命令使系统管理员能够有效地控制应用程序的生命周期,确保运行 systemd 的 Linux 环境的可靠性和正确的配置管理。