第 58 课:systemctl 服务管理
所属模块:进程管理
难度:中级
标签:systemctl, services
上一课:systemd 体系入门
下一课:编写 systemd Unit 文件
1. 学习目标
完成本课后,你将能够:
- 熟练运用
systemctl命令管理 systemd 系统中的服务。 - 理解并区分服务的不同状态(如 active, inactive, enabled, disabled)。
- 掌握启动、停止、重启、重载和查看服务状态的核心操作。
- 学会查看服务的日志信息,用于故障排查。
- 设置服务在系统启动时自动运行或禁止自动运行。
2. 核心概念
在 systemd 的世界里,你管理和交互的对象主要是 Unit(单元)。服务(.service 文件)是最常见的一种 Unit 类型,比如 Web 服务器(httpd, nginx)、数据库(mariadb)等。systemctl 就是你操作这些服务的核心遥控器。
你可以把它想象成你手机上的一个“设备管理”应用:它能告诉你哪些 App(服务)正在运行、哪些被禁用,还能让你一键启动或关闭它们。
服务状态解读:
active (running): 服务进程正在运行,工作正常。inactive (dead): 服务已停止,未运行。active (exited): 服务的一次性任务已完成并退出,常见于启动脚本类的服务。failed: 服务启动或运行失败,需要检查。
开机自启状态(enabled / disabled):
这决定了系统开机时,该服务是否会自动启动。这是一个长期配置,与服务当前是否运行是两回事。
enabled: 已配置为开机自启。disabled: 未配置为开机自启。
systemctl 的基本语法:
systemctl <命令> <服务名.service>
提示:通常可以省略
.service后缀,系统会默认按服务来处理。
3. 代码示例
以下示例以一个常见的 Web 服务器 httpd(或 apache2)为例。请确保你的系统上已安装对应的服务。
# 1. 查看服务状态(这是最常用的命令之一)
# 输出会详细显示服务是否运行、主进程PID、内存占用以及最近几条日志。
sudo systemctl status httpd.service
# 示例输出片段:
# ● httpd.service - The Apache HTTP Server
# Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
# Active: active (running) since ...
# Main PID: 1234 (httpd)
# ...
# 2. 启动、停止、重启服务
sudo systemctl start httpd.service # 启动服务
sudo systemctl stop httpd.service # 停止服务
sudo systemctl restart httpd.service # 重启服务(推荐:先停后启)
# 3. 重载服务配置(不中断服务,推荐用于加载新配置)
# 要求服务支持 `reload` 动作。并非所有服务都支持。
sudo systemctl reload httpd.service
# 4. 管理服务的开机自启状态
sudo systemctl enable httpd.service # 设置为开机自启
sudo systemctl disable httpd.service # 禁止开机自启
# 查看某个服务是否开机自启:
systemctl is-enabled httpd.service # 输出 `enabled` 或 `disabled`
# 5. 查看所有服务的列表(过滤与显示)
# 列出所有已加载的单元文件(包括活动的和不活动的):
systemctl list-unit-files --type=service
# 只列出当前正在运行的服务:
systemctl list-units --type=service --state=running
# 查看某个服务是否处于 `failed` 状态(用于故障排查):
systemctl --failed
# 6. 查看服务日志(与 journalctl 配合使用)
# 查看 httpd 服务的最新日志
journalctl -u httpd.service
# 实时跟踪日志(类似 `tail -f`)
journalctl -u httpd.service -f
# 只看今天的日志
journalctl -u httpd.service --since today
4. 实践练习
练习 1:基础状态查看
- 检查你的系统中
sshd(SSH 服务) 的状态。 - 判断它是否正在运行。
- 判断它是否设置了开机自启。
- 将你的输出结果和结论写下来。
练习 2:服务生命周期管理
假设你刚安装了 nginx 服务。
- 启动
nginx服务。 - 验证它是否成功启动(使用
status或检查端口sudo ss -tlnp | grep 80)。 - 停止该服务。
- 将其设置为开机自启,但不立即启动它。完成后再用
status命令查看其状态。
练习 3:故障排查模拟
- 人为让一个服务出错(例如,编辑一个服务的配置文件使其语法错误,比如
sudo vi /etc/nginx/nginx.conf,故意写错一行)。 - 尝试重启该服务:
sudo systemctl restart nginx。 - 服务应该会失败。现在使用
systemctl status nginx查看错误摘要。 - 最后,使用
journalctl -u nginx -e查看更详细的错误日志,找出具体原因。 - 修复配置文件并重启服务。
5. 常见错误
- 忘记
sudo权限:systemctl管理的是系统级服务,绝大多数操作(start, stop, enable, disable)都需要 root 权限。忘记加sudo会提示Permission denied。 - 混淆服务名:系统上可能存在不同的服务包名(如
httpdvsapache2)。可以使用systemctl list-unit-files | grep 服务名来确认准确的服务名。 - 混淆
restart和reload:restart会中断现有连接,reload则不会。对于配置更改,优先尝试reload。 - 忽略日志:当服务状态显示
failed或inactive (dead)时,第一反应应该是用systemctl status和journalctl -u查看日志,而不是反复尝试启动。 - 依赖
service和chkconfig命令:在较新的 systemd 系统中,这些旧命令可能只是兼容性包装,底层仍是调用systemctl。建议直接使用systemctl以获得最完整的功能和一致性。
6. 小结
systemctl是管理 systemd 服务(Unit)的核心工具。- 掌握
start,stop,restart,status等基本命令来控制服务的运行状态。 - 使用
enable,disable配置服务的开机自启状态。 - 利用
systemctl status <服务名>和journalctl -u <服务名>组合拳来查看状态和排查问题。 - 永远记住:服务配置更改后,优先尝试
reload而非restart,并养成查看日志的习惯。
熟练掌握 systemctl,你就拥有了管理现代 Linux 系统服务能力的钥匙。下一步,我们将深入学习如何编写自定义的 systemd Unit 文件。
练习编辑器
rust
Loading...