如何使用 systemctl 列出 Linux 服务
已发表: 2022-10-23您的 Linux 计算机依赖于许多称为服务或守护程序的后台任务。 在基于 systemd 的发行版上,您有内置命令,可让您查看哪些服务正在运行、禁用或失败。
服务和守护进程
服务和守护程序是在没有用户界面的情况下运行的后台任务,不需要人工交互,并且通常在计算机启动时启动。
有一次,服务由init
,这是第一个启动的进程。 服务的详细信息保存在“/etc/init/d”目录中的一组脚本中。 在非系统发行版上仍然如此。
在 systemd 世界中,服务由systemd
启动,这是现在要启动的第一个进程。 服务的详细信息存储在“/usr/lib/systemd”目录中的单元文件中。
根据其手册页, systemd
是一个系统和服务管理器。 您可以使用systemctl
命令来检查和控制 systemd 系统的不同方面,包括服务和守护进程。
因为我们在这里查看特定于 systemd 的命令,所以您需要知道的第一件事是您是否正在运行基于 systemd 的发行版。
相关:为什么 Linux 的 systemd 在这么多年之后仍然存在分歧
init 还是基于systemd?
绝大多数 Linux 发行版都使用 systemd,包括 Arch、Red Hat 和 Debian,以及许多衍生自它们的发行版。 这包括 Ubuntu 系列发行版、Fedora 及其自旋,以及 Manjaro 和其他基于 Arch 的发行版。
但是,这些发行版中有一些分支或风格是专门为避免使用 systemd 而创建的。 不仅如此,人们还可以选择使用其他 init 系统来代替其发行版中默认提供的系统,例如 runit 或 s6-linux-init。
如果您必须管理一台不是您自己设置的 Linux 计算机,那么确定它是否使用 systemd 的唯一方法是检查。 我们可以通过使用pstree
命令查看进程树来做到这一点。 我们只需要查看树的最顶端——毕竟我们正在寻找第一个运行的进程——所以我们将通过head
命令管道输出,并询问前五个条目。
pstree | 头-5
我们可以看到systemd
是启动后运行的第一个进程,因此我们肯定是在基于 systemd 的 Linux 安装上。
相关:如何从 Linux 终端管理进程:您需要知道的 10 个命令
使用 systemctl 列出服务
列出服务和守护进程的命令是systemctl
。 我们可以使用type
和state
选项来优化systemctl
命令。 我们要求systemctl
报告处于运行状态的服务。
systemctl --type=service --state=running
生成信息表。 如果它对于您的终端窗口来说太宽或太长,它会显示在您的默认文件查看器中,这可能会是less
。
要查看表格的右端,请按右箭头键。 要返回通常视图,请按向左箭头键。
按Q键退出less。 显示的列是:
- Unit :服务或守护进程的名称。 该列的标题为“Unit”,因为该列中的任何内容都是使用单元文件中的
systemd
信息启动的。 - Load :服务或守护程序的负载状态。 它可以被加载、未找到、错误设置、错误或被屏蔽。
- 活动:服务或守护程序所处的整体状态。它可以是活动的、重新加载的、非活动的、失败的、激活的或停用的。
- SUB :服务或守护进程的子状态。 它可以是死的、退出的、失败的、不活动的或正在运行的。
- 描述:单位的简短描述。
如果我们想专注于单个服务,我们可以通过grep
管道输出systemctl
的输出。 此命令隔离ssh
服务的表条目。
systemctl --type=service --state=running | grep ssh
到目前为止,我们一直在通过提供state=running
选项来过滤表格的内容。 我们可以使用子状态的任何可能值来代替:dead、exited、failed、inactive 或 running。
让我们寻找失败的服务:
systemctl --type=service --state=失败
可以使用子状态的组合。 以逗号分隔的列表形式键入它们。 确保您没有在选项之间包含任何空格。 请注意,这会查找与任一状态匹配的服务。
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 列表单元文件
输出将包含比先前命令的结果更多的条目。
在我们的测试计算机上,结果列表几乎是我们之前命令输出的四倍。
如果你确实想使用state
选项,你可以像我们之前看到的那样使用多个 state。 相同的规则适用。 以逗号分隔值的形式提供选项,并且不包含任何空格。
此命令将列出所有已禁用或无法启动的单元文件。
systemctl list-unit-files --state=enabled,失败
显示的结果数量减少,根据您使用 state 选项所做的选择进行过滤。
详细查看一项服务
如果某项服务或守护进程的某些内容激起了您的兴趣并值得深入研究,您可以使用 systemctl status 选项详细查看它。
让我们看一下 SSH 守护进程 sshd。 我们需要做的就是使用状态选项和服务或守护进程的名称。
systemctl 状态 sshd
这个紧凑的显示器显示:
- 服务的名称和简短的描述。 颜色编码的点显示它是否正在运行。 绿色表示正在运行,红色表示未运行。
- 加载了什么,包括单元文件的路径。
- 它已经运行了多长时间。
- 文档位于
man
中的位置。 - 正在运行的实例的进程 ID。
- 此服务有多少并发实例正在运行。 通常这将是一个。
- 正在消耗多少内存。
- 消耗了多少 CPU 时间。
- 服务所属的控制组。
还会显示系统日志中的相关条目。 这些通常是诸如服务启动之类的事件。 如果您正在查看未正确启动的服务或守护程序,这些可能会提供信息。
相关:如何使用 journalctl 读取 Linux 系统日志
自主系统
服务和守护程序提供了操作系统的许多自动操作,因此它们至关重要。 这意味着他们的健康也很重要。
查看您的服务、守护程序和单元文件很容易,而且信息量很大。 如果服务或守护程序拒绝启动,这也是一个有价值的故障排除步骤。
相关:如何解决 Linux 上的“打开文件过多”错误