systemctl 服务列表详解:如何查看、管理和排查 Linux 服务

.

1. 介绍

在使用 Linux 时,常常需要检查服务状态或查看正在运行的进程列表。在这种情况下,systemctl 命令非常有用。

该命令配合 systemd(现代 Linux 发行版使用的启动系统和服务管理器)工作。它提供了丰富的功能,包括检查服务(单元)状态、启动、停止、重启服务以及显示服务列表等。

从 “systemctl 服务列表” 的角度来看,你不仅可以查看当前活跃的服务,还可以看到已禁用的服务以及配置为自动启动的服务,从而多角度了解系统整体配置。

本章节简要说明 systemctl 是什么,并概述本文将要学习的内容。

systemctl 是什么?

systemctl 是在基于 systemd 的 Linux 发行版上,用于控制和检查各种 “单元”(如服务、目标、挂载点)的标准工具。

例如,它可用于启动或停止 Apache(httpd)和 SSH 等服务,并以列表形式显示它们的状态。

systemd 与 systemctl 的关系

systemd 是负责 Linux 启动过程和服务管理的核心机制,取代了 SysVinit、Upstart 等旧系统。与 systemd 交互的命令行工具就是 systemctl

换句话说,如果 systemd 是指挥中心,systemctl 则是下达指令的操作员。

本文将教会你什么

本文将回答以下问题:

  • 如何查看当前正在运行的服务列表?
  • 如何显示所有服务(包括未激活的)?
  • 如何检查某个服务是否在启动时自动启动?
  • 如何解读服务列表的输出?

为了让 Linux 初学者更易理解,文中提供了详细的命令示例和输出说明。

2. 使用 systemctl 显示服务列表的方法

在 Linux 系统管理中,快速了解服务列表极为重要。借助 systemctl 命令,你可以轻松查看活跃服务、非活跃服务以及启动配置情况。

本节从以下三个视角说明服务列表的获取方法:

  • 活跃服务列表
  • 所有服务列表(包括非活跃的)
  • 服务单元文件列表(包括启动设置)

2.1 显示当前活跃的服务列表

要检查当前正在运行的服务,请使用以下命令:

systemctl list-units --type=service

该命令会列出活跃的服务。输出包含以下字段:

FieldDescription
UNITService name (e.g., ssh.service)
LOADWhether the unit file is loaded
ACTIVEService state (e.g., active, inactive, failed)
SUBMore detailed status (e.g., running, exited, dead)
DESCRIPTIONService description

这些信息可以帮助你判断例如 nginx 是否在运行,或哪些服务当前处于活跃状态。

2.2 显示包括非活跃服务在内的全部服务

默认情况下,list-units 只显示活跃服务。若要同时显示非活跃服务,需要添加 --all 选项。

systemctl list-units --type=service --all

这样即可显示未启动过或已停止的服务。

你还可以使用 --state= 选项按服务状态进一步过滤结果:

systemctl list-units --type=service --state=inactive

当你只想查看已停止的服务时,这非常有用。

2.3 查看服务单元文件列表

要检查哪些服务在启动时被启用或禁用,请使用以下命令:

systemctl list-unit-files --type=service

该命令会列出所有服务单元文件及其启用/禁用状态。

STATEDescription
enabledAutomatically starts at boot
disabledDoes not start automatically
staticCannot be enabled or disabled manually
maskedExplicitly disabled and cannot be started

通过此列表,你可以直观地了解哪些服务会在系统启动时自动启动,以及哪些服务被错误地屏蔽(masked)。

3. 使用 systemctl 进行基础服务管理

systemctl 命令允许你启动、停止、重启服务,并配置启动行为。

3.1 启动服务

sudo systemctl start service-name

示例:

sudo systemctl start httpd.service

3.2 停止服务

sudo systemctl stop service-name

示例:

sudo systemctl stop sshd.service

3.3 重启服务

sudo systemctl restart service-name

示例:

sudo systemctl restart nginx.service

3.4 检查服务状态

systemctl status service-name

示例:

systemctl status mysql.service

3.5 启用自动启动

sudo systemctl enable service-name

示例:

sudo systemctl enable docker.service

3.6 禁用自动启动

sudo systemctl disable service-name

示例:

sudo systemctl disable cups.service

3.7 检查启动状态

systemctl is-enabled service-name
enabled

4. 有用的 systemctl 选项和高级技巧

4.1 列出服务依赖关系

systemctl list-dependencies service-name

4.2 查看单元文件内容

systemctl cat service-name

4.3 重新加载单元文件

sudo systemctl daemon-reexec
sudo systemctl daemon-reload

4.4 查看服务日志

journalctl -u service-name

5. 常见问题和故障排除

5.1 服务启动失败时

systemctl status service-name
journalctl -xe

5.2 理解 status 输出中的错误消息

● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
   Active: failed (Result: exit-code)

5.3 服务启动后立即停止

  • 配置错误
  • 端口冲突
  • 缺少文件或目录
  • 权限不足

5.4 服务被屏蔽时

sudo systemctl unmask service-name

6. 总结

服务管理是 Linux 系统操作的重要组成部分,而 systemctl 在控制和理解系统服务方面发挥着核心作用。

7. 常见问题解答 (FAQ)

本节回答关于 systemctl 和服务管理的常见问题。

Q1. systemctlservice 命令有什么区别?

A1.
systemctl 是一个专为基于 systemd 的系统设计的服务管理命令,是大多数现代 Linux 发行版(如 Ubuntu、CentOS 和 Fedora)使用的标准工具。
相比之下,service 命令用于较旧的基于 SysVinit 的系统。虽然它可能仍因兼容性原因存在,但在 systemd 环境中强烈推荐使用 systemctl

Q2. list-unitslist-unit-files 有什么区别?

A2.

  • list-units 显示当前加载的单元,即正在运行或最近使用过的服务。
  • list-unit-files 显示所有单元文件及其启用状态(启用、禁用等)。简而言之,一个显示当前活动的项目,而另一个显示服务的配置方式。

Q3. 静态状态的服务可以启动吗?

A3.
是的,处于 static 状态的服务可以使用 start 手动启动。但是,它们无法启用在引导时自动启动。
这是因为静态服务设计为作为其他单元的依赖项启动。

Q4. 服务被屏蔽无法启动。我该怎么办?

A4.
masked 的服务完全禁用,无法启动。要解决此问题,请使用以下命令取消屏蔽服务:

sudo systemctl unmask service-name

取消屏蔽后,您可以正常启动服务。

Q5. 有没有图形界面方法查看服务状态?

A5.
根据发行版的不同,诸如 gnome-system-monitorKSysGuardCockpit 等工具允许您通过图形界面查看服务状态。
然而,对于诸如在引导时启用或禁用服务等高级操作,systemctl 仍然是最可靠的方法。

Q6. 我应该将自定义单元文件放置在哪里?

A6.
自定义单元文件通常放置在 /etc/systemd/system/ 中。在编辑或添加单元文件后,始终运行以下命令:

sudo systemctl daemon-reload

然后,您可以使用 startenable 正常管理服务。

侍エンジニア塾