如何使用 systemctl 列出 Linux 服务

总结:要使用 systemd 查看 Linux 系统上所有正在运行的服务,请使用命令“systemctl --type=service --state=running”。这将向您显示每个活动服务的名称、负载、子状态和描述。您还可以更改状态值以查看已停止、退出、失败或不活动的服务。
您的 Linux 计算机依赖于许多称为服务或守护进程的后台任务。在基于 systemd 的发行版上,您拥有内置命令,可让您查看哪些服务正在运行、禁用或失败。
服务和守护进程
服务和守护进程是在没有用户界面的情况下运行的后台任务,不需要人工交互,通常在计算机启动时启动。
有一次,服务由 init
启动,这是第一个启动的进程。服务的详细信息保存在位于“/etc/init/d”目录中的一组脚本中。在非系统发行版上,情况仍然如此。
在 systemd 世界中,服务由 systemd
启动,这是现在第一个启动的进程。服务的详细信息存储在位于“/usr/lib/systemd”目录中的单元文件中。
根据其手册页,systemd
是一个系统和服务管理器。您可以使用 systemctl
命令来检查和控制 systemd 系统的不同方面,包括服务和守护进程。
因为我们在这里查看特定于 systemd 的命令,所以您需要知道的第一件事是您是否正在运行基于 systemd 的发行版。
init 还是基于 systemd 的?
绝大多数 Linux 发行版都使用 systemd,包括 Arch、Red Hat 和 Debian,以及许多从它们派生的发行版。这包括 Ubuntu 系列发行版、Fedora 及其衍生版,以及 Manjaro 和其他基于 Arch 的发行版。
但是,这些发行版中有一些是专门为避免必须使用 systemd 而创建的。不仅如此,有些人还可以选择使用其他初始化系统来代替其发行版中默认提供的系统,例如 runit 或 s6-linux-init。
如果你必须管理一台不是你自己设置的 Linux 计算机,那么确定它是否使用 systemd 的唯一方法就是检查。我们可以通过使用 pstree
命令查看进程树来做到这一点。我们只需要查看树的最顶端——毕竟,我们正在寻找运行的第一个进程——所以我们将通过 head
命令传输输出,并请求前五个条目。
pstree | head -5

我们可以看到 systemd
是启动后运行的第一个进程,所以我们肯定是在基于 systemd 的 Linux 安装上。
使用 systemctl 列出服务
列出服务和守护进程的命令是 systemctl
。我们可以使用 type
和 state
选项优化 systemctl
命令。我们要求 systemctl
报告处于运行状态的服务。
systemctl --type=service --state=running

生成信息表。如果它对于您的终端窗口来说太宽或太长,它将显示在您的默认文件查看器中,这可能会更少
。

要查看表格的右端,请按向右箭头键。要返回到通常的视图,请按向左箭头键。

按 Q 键退出 less。显示的列是:
- Unit:服务或守护进程的名称。该列的标题为“单元”,因为此列中的任何内容都是使用单元文件中的信息
systemd
启动的。 - Load:服务或守护进程的加载状态。它可能已加载、未找到、错误设置、错误或被屏蔽。
- 活动:服务或守护进程所处的总体状态。它可以是活动、重新加载、不活动、失败、激活或停用。
- SUB:服务或守护进程的子状态。它可以是死的、退出的、失败的、不活动的或正在运行的。
- 描述:单元的简短描述。
如果我们想专注于单个服务,我们可以将 systemctl
的输出通过 grep
进行管道传输。此命令隔离 ssh
服务的表条目。
systemctl --type=service --state=running | grep ssh

到目前为止,我们一直在通过提供 state=running
选项来过滤表的内容。我们可以使用子状态的任何可能值来代替:dead、exited、failed、inactive 或 running。
让我们寻找失败的服务:
systemctl --type=service --state=failed

可以使用子状态的组合。以逗号分隔的列表形式键入它们。确保选项之间不包含任何空格。请注意,这会找到匹配任一 状态的服务。
systemctl --type=service --state=failed,exited

按向右箭头键查看屏幕外的列显示我们在列表中混合了退出和失败的服务。

默认情况下,systemctl
会列出由 systemd
启动的进程(服务和守护进程),因为 systemd
找到了包含有效单元文件的单元文件为他们。这就是为什么所有这些过程的简写术语是“单元”。
有一个选项可以显式请求 systemctl
列出单位,但由于它是默认操作,因此不常使用。
这些命令产生相同的结果。
sudo systemctl list-units --type=service --state=running
sudo systemctl --type=service --state=running
使用 systemctl 列出单元文件
我们可以通过包含 list-unit-files
选项来扩展 systemctl
命令的范围。这不仅会报告已启动的服务和守护进程,还会列出您计算机上安装的所有单元文件。
systemctl list-unit-files --state=enabled

显示彩色表格。

删除 state
选项会删除过滤。输出将包含所有已安装的单元文件,无论其状态如何。
systemctl list-unit-files

输出将包含比先前命令的结果多得多的条目。

在我们的测试计算机上,结果列表几乎是我们之前命令输出的四倍。
如果你确实想使用 state
选项,你可以像我们之前看到的那样使用多个状态。同样的规则适用。以逗号分隔值的形式提供选项,并且不包含任何空格。
此命令将列出所有已禁用或无法启动的单元文件。
systemctl list-unit-files --state=enabled,failed

显示的结果数量减少,并根据您使用状态选项所做的选择进行过滤。

详细了解一项服务
如果关于一项服务或守护进程的某些事情激起了您的兴趣并且值得深入研究,您可以使用 systemctl status 选项详细查看它。
让我们看一下 SSH 守护进程 sshd。我们需要做的就是使用状态选项和服务或守护进程的名称。
systemctl status sshd

这个紧凑的显示显示:
- 服务名称和简短描述。颜色编码的点显示它是否正在运行。绿色表示正在运行,红色表示未运行。
- 加载了什么,包括单元文件的路径。
- 运行了多长时间。
- 文档位于
man
手册中的位置。 - 正在运行的实例的进程 ID。
- 有多少此服务的并发实例正在运行。通常这是一个。
- 消耗了多少内存。
- 消耗了多少 CPU 时间。
- 服务所属的对照组。
还会显示系统日志中的相关条目。这些通常是服务启动等事件。如果您正在调查未正确启动的服务或守护进程,这些可以提供信息。
自主系统
服务和守护进程提供了操作系统的许多自动操作,因此它们至关重要。这意味着他们的健康也至关重要。
查看您的服务、守护进程和单元文件很容易,而且信息丰富。如果服务或守护进程拒绝启动,这也是一个有价值的故障排除步骤。