如何从systemctl列出所有已启用的服务?

如何从systemctl中列出所有已启用的服务?
我知道运行systemctl命令本身会列出所有服务,但我只想获取已启用的服务。

你说的"enabled"是什么意思?你是指正在运行的服务吗? - Gen
14@Gen 启用一个服务与启动它是完全不同的。请参考 man systemctl - Jos
6有趣。最低评分的答案却是最“正确”的答案,尽管显然不是最好的答案。这个出色的问题(以及它的答案)是一个有趣的例子,展示了systemd如何违反了Unix和其他操作系统的长期(而且精彩的)设计原则。@FelipeAlvarez抱怨说,最被接受的答案假设systemd遵循Unix的设计哲学,但systemd/systemctl确实可以做到他想要的事情(大多数经验丰富的用户只会认为那是完全臃肿的)。我开始更清楚地看到为什么Linus Torvalds对systemd如此强烈地批评了。 - BISI
如果您想列出“模板化”的服务(blabla@instance.service),请不要忘记添加“--all” - 感谢下面的@rafdouglas。 - jehon
10个回答

systemctl list-unit-files | grep enabled 将列出所有已启用的单位文件。

如果您想知道当前正在运行的单位文件,您需要使用 systemctl | grep running

使用您要查找的那个。已启用并不意味着它正在运行。运行并不意味着它已启用。它们是两个不同的概念。

已启用意味着系统将在下次启动时运行该服务。因此,如果您启用了一个服务,仍然需要手动启动它,或者重新启动系统以启动它。

正在运行意味着它实际上正在运行,但如果它未启用,则在重新启动时将不会重新启动。


12很烦人必须使用外部工具(grep)来显示这个重要信息。但是感谢你指引我们的方向 :) - Felipe Alvarez
1@FelipeAlvarez 不客气!然而,grep并不是一个外部工具,它是一个基本命令。你可以随时编写自己的脚本,使用更简单的名称来运行这些命令。我经常这样做。 - Delorean
1Grep不是systemctl,所以操作系统必须调用另一个工具。这就是我所指的 :-) 一个工具(systemctl)应该做好一项工作,非常非常出色。 - Felipe Alvarez
57@FelipeAlvarez 正确。但这就是Linux的工作方式。许多小型二进制文件相互配合良好。systemctl会执行所要求的操作,列出服务。systemctl内部没有过滤命令,因为已经存在grep可以很好地处理任何程序的输出。这一直都是如此 :) - Delorean
8我同意,事情本应如此。但是,systemd已经试图做了这么多的事情,所以我想知道为什么它不能列出启用的服务? - Felipe Alvarez
3@FelipeAlvarez Linux的核心理念是使用小型工具,这一理念源自Unix:“让每个程序都做好一件事。要完成新任务,应该重新构建而不是通过添加新的“功能”来复杂化旧程序。”- 1978年《贝尔系统技术杂志》 - Delorean
7systemctl | grep running 对我来说没有列出任何内容!即使有东西在运行,也只会以其状态如“已启用、已禁用、已屏蔽、静态”进行列出。 - Cirelli94
+1 我能够使用 systemctl | grep -E 'running.*active|active.*running' | grep mys 命令来查看 mysql 服务是否正在运行。 - Eric Hepperle - CodeSlayer2010
@Cirelli94 这很奇怪。systemctl没有其他选项时,它会显示一个输出,其中第四列说明某个进程是否正在运行/失败/退出等等。你确定你是在运行Ubuntu 16.04吗? - Delorean
1@EricHepperle-CodeSlayer2010 你其实不需要那么多,只需执行 systemctl | grep mysql 就可以查看它是否正在运行。 - Delorean
47更简单的命令是:systemctl list-unit-files --state=running - Will
2看起来 systemctl list-unit-files 并没有列出所有的服务。例如,它没有列出 tinc,尽管 tinc 是已启用的。也许 systemctl list-unit-files 只列出了有单元文件的服务?但是它没有列出任何可能通过传统 sysv 风格的 init 脚本启用的服务。 - mpb
使用systemctl命令的输出进行grep操作似乎会产生一堆在奇怪位置断开的行... - Tom
1@TomH 在16.04、17.10或18.04上没有任何问题。请验证您的安装。 - Delorean
通常,单元文件的名称不必与单元的名称相同。例如,在18.04版本中,有一个名为sshd.service的单元文件,但该单元实际上被称为ssh.service。服务模板也是如此。 - OrangeDog
这对于带有参数的实例无效,例如你可能已经启用了my@x.service并禁用了my@y.service。从systemctl list-unit-files中你只会看到my@.service indirect,这是无用的。 - Walf
@Walf 尝试在 systemctl 命令中添加 --all 参数。 - digital_infinity
@digital_infinity 这对实例没有任何影响。 - Walf
@Walf 在我启用了所有实例后,我使用了--all选项来列出所有实例的状态或启动它们。是否使用了通配符?(systemctl list-unit-files 'my@*' --all - digital_infinity
@Walf 现在我看到 --allstatus 上正常工作了,但在 list-unit-files 上却不起作用。 - digital_infinity
任何systemd单元文件都不得包含字符串"running"或"enabled"。long_running_backup.servicegpu_enabled_calculation.service将导致未来出现错误。这是Unix哲学的最佳体现。 - ominug
为了增强它的稳定性,给 systemctl 添加参数 --no-legend,并给 grep 添加 -w 参数。 - ominug

man systemctl 的说明如下:

--state=

参数应为逗号分隔的单元 LOADSUBACTIVE 状态的列表。在列出单元时,仅显示指定状态的单元。使用 --state=failed 仅显示失败的单元。

解释:

LOAD:反映单元定义是否已正确加载。
ACTIVE:高级单元激活状态,即 SUB 的概括。
SUB:低级单元激活状态,值取决于单元类型。

您也可以使用此选项仅显示 enabled 单元:

systemctl list-unit-files --state=enabled

如果一个单元被“启用”,那意味着系统会在启动时启动它。尽管将某个东西设置为“启用”并不会自动“启动”它,所以您需要手动执行该操作,或者在将其设置为“启用”后重新启动系统。

11同时启用和启动:systemctl enable --now ... - Mmmh mmh
2--state=enabled 在 systemd 版本 215(在 Raspbian 8 Jessie 上)上没有效果,但在 systemd 版本 229(在 Ubuntu 16.04.03 Xenial 上)上有效。 - mpb
@mpb:但在Arch Linux的235版本上它完全正常运行。 - user364819
你还可以检查--state=generated以查看可能正在运行的生成的单元文件(例如,pihole-FTL服务就是这样工作的)。 - mgalgs
  1. 答案缺少一个 --type service 的服务类型过滤器,只能筛选出该类型的单元。
  2. @mgalgs 的 list-unit-files 现在包括生成的单元。链接
- Pablo Bianchi
如果服务是基于模板servicename@.service的,而--list-units命令则不会显示该服务。 - Mat M

列出所有处于“state=active”和“sub=running”状态的systemd服务。
systemctl list-units --type=service --state=running

列出所有 systemd 服务,其状态为 active,并且子状态为运行中或已退出

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

--list-units 如果服务是基于模板 servicename@.service,则显示该服务(们) +1 - Mat M

查看“已启用”的服务,包括那些仍在upstart/init运行中的服务:
systemctl list-unit-files --type service --state enabled,generated

要查看所有当前运行的服务,请运行以下命令:
systemctl list-units --type service --state running

很不幸,这两个列表中的服务名称可能会有所不同,例如sshdssh,以及syslogrsyslog - OrangeDog
唯一的“非grep”正确答案。虽然不确定为什么提到了upstart... - rogerdpack
list-unit-files现在包括生成的单元,详情请参见:https://lists.freedesktop.org/archives/systemd-devel/2019-May/042555.html - Pablo Bianchi

有一个很好的图形用户界面应用程序叫做Stacer,你可以在其中管理所有的服务。

enter image description here

请检查它的Github链接Stacer Github
还可以查看Web获取更多信息

所有活动和失败服务的概述:
systemctl list-units --type service --state running,failed

除了目前的答案之外,我使用以下方法只获取服务的名称:
systemctl list-units --type=service --state=active,running | awk '/.*\.service/ {print $1}'

不同于表格格式,这样做使得将这些服务导入另一个程序更加容易。

systemctl单元模板怎么样?

要列出模板化的单元,您可以使用以下命令:

systemctl list-units --all|grep yourservice

--all开关还会显示所有已实例化的单元,这些单元是通过以下方式实例化的:

systemctl <service_name>@<argument>.service

来自man手册的说明:

当使用list-units列出单元时,还会显示非活动单元和跟随其他单元的单元。在显示单元/作业/管理器属性时,无论是否设置,都会显示所有属性。

示例:

systemctl openvpn@my_office_endopoint.service

进一步阅读: https://fedoramagazine.org/systemd-template-unit-files/


1其他回复中缺少了“--all”参数! - jehon

列出 用户 otheruser 活动用户 服务:

sudo runuser -l otheruser-c "systemctl --user list-units --type=service --state=active"

这对我来说是检查我应该启用的运行或失败的服务的最快方式。通过这个,我知道我不必运行:
sudo shutdown -r now

我只是在状态上使用了上述大部分,用逗号分隔。
systemctl list-units --type=service --state=running,enabled,failed,generated