58·进程管理进阶

systemctl 服务管理

systemctlservices

第 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:基础状态查看

  1. 检查你的系统中 sshd (SSH 服务) 的状态。
  2. 判断它是否正在运行。
  3. 判断它是否设置了开机自启。
  4. 将你的输出结果和结论写下来。

练习 2:服务生命周期管理 假设你刚安装了 nginx 服务。

  1. 启动 nginx 服务。
  2. 验证它是否成功启动(使用 status 或检查端口 sudo ss -tlnp | grep 80)。
  3. 停止该服务。
  4. 将其设置为开机自启,但立即启动它。完成后再用 status 命令查看其状态。

练习 3:故障排查模拟

  1. 人为让一个服务出错(例如,编辑一个服务的配置文件使其语法错误,比如 sudo vi /etc/nginx/nginx.conf,故意写错一行)。
  2. 尝试重启该服务:sudo systemctl restart nginx
  3. 服务应该会失败。现在使用 systemctl status nginx 查看错误摘要。
  4. 最后,使用 journalctl -u nginx -e 查看更详细的错误日志,找出具体原因。
  5. 修复配置文件并重启服务。

5. 常见错误

  1. 忘记 sudo 权限systemctl 管理的是系统级服务,绝大多数操作(start, stop, enable, disable)都需要 root 权限。忘记加 sudo 会提示 Permission denied
  2. 混淆服务名:系统上可能存在不同的服务包名(如 httpd vs apache2)。可以使用 systemctl list-unit-files | grep 服务名 来确认准确的服务名。
  3. 混淆 restartreloadrestart 会中断现有连接,reload 则不会。对于配置更改,优先尝试 reload
  4. 忽略日志:当服务状态显示 failedinactive (dead) 时,第一反应应该是用 systemctl statusjournalctl -u 查看日志,而不是反复尝试启动。
  5. 依赖 servicechkconfig 命令:在较新的 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...

继续学习

完成本课后,建议继续学习下一课「编写 systemd Unit 文件」 以巩固所学知识。