如何在 Linux 中列出 Systemd 服务
虽然 systemd 解决了许多系统管理问题,但有时也会令人困惑。
即使是像列出 systemd 服务这样简单的任务也会让你思考。
在本文中,我将向您展示如何列出 systemd 服务。我还将解释输出,以便您更容易理解服务的不同状态。
我假设您对 systemd 有一些了解,但即使您不了解,也应该没问题。
如何列出 systemd 中的活动服务
systemd服务由该命令管理systemctl
。如果您在运行时systemctl
不带任何参数,它将调用默认list-units
子命令并列出各种类型的 systemd 单元,如服务、套接字、目标等。
但您的目标是列出服务,因此您可以使用--type
这样的标志指定单位类型:
systemctl --type=service
您是否注意到我没有指定list-units
子命令,因为它是默认的?如果您想遵循惯例,也可以指定它。我更喜欢这种方式,我将在本教程的其余部分遵循此惯例。
systemctl list-units --type=service
两种情况下的输出都相同。默认情况下,此命令仅按字母顺序显示已加载和活动的服务:
UNIT LOAD ACTIVE SUB DESCRIPTION
accounts-daemon.service loaded active running Accounts Service
acpid.service loaded active running ACPI event daemon
alsa-restore.service loaded active exited Save/Restore Sound Card State
apparmor.service loaded active exited Load AppArmor profiles
apport.service loaded active exited LSB: automatic crash report generation
让我解释一下输出:
UNIT
:systemd 单元的名称。LOAD
:该单元配置文件是否已经被systemd解析。ACTIVE
:单元的高电平状态。SUB
:单元的低电平状态。活跃单元可以处于运行状态或退出状态。该值取决于服务类型。
如您所见,您可以列出 Linux 系统上已加载的服务。但活动的 systemd 服务可能正在运行或退出(成功运行后)。
列出所有正在运行的 systemd 服务
活动状态还可以具有子状态,如运行、退出等。您可以将相同的--state
标志与子状态一起使用。
要列出正在运行的 systemd 服务,请使用--state=running
如下标志:
systemctl list-units --type=service --state=running
下面是我的系统的示例输出,显示了一些正在运行的 systemd 服务:
UNIT LOAD ACTIVE SUB DESCRIPTION
accounts-daemon.service loaded active running Accounts Service
acpid.service loaded active running ACPI event daemon
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
bluetooth.service loaded active running Bluetooth service
bolt.service loaded active running Thunderbolt system service
列出所有已加载的 systemd 服务,包括不活动的服务
默认情况下,systemctl 命令仅显示已加载和活动的单元。
如果您想列出所有已加载的服务(包括不活动的服务),请使用以下--all
标志:
systemctl list-units --all --type=service
您现在甚至可以看到不活动的服务:
UNIT LOAD ACTIVE SUB DESCRIPTION
accounts-daemon.service loaded active running Accounts Service
acpid.service loaded active running ACPI event daemon
alsa-restore.service loaded active exited Save/Restore Sound Card State
alsa-state.service loaded inactive dead Manage Sound Card State (restore and store)
anacron.service loaded inactive dead Run anacron jobs
apparmor.service loaded active exited Load AppArmor profiles
列出所有不活动的 systemd 服务
如果您只想查看不活动的服务,您可以组合各种标志,如下--all
所示--state
:
systemctl list-units --all --type=service --state=inactive
正如您在输出中看到的,它显示了所有不活动的 systemd 服务:
UNIT LOAD ACTIVE SUB DESCRIPTION
alsa-state.service loaded inactive dead Manage Sound Card State (restore and store)
anacron.service loaded inactive dead Run anacron jobs
apport-autoreport.service loaded inactive dead Process error reports when automatic reporting is enabled
apt-daily-upgrade.service loaded inactive dead Daily apt upgrade and clean activities
apt-daily.service loaded inactive dead Daily apt download activities
● auditd.service not-found inactive dead auditd.service
列出所有已安装的 systemd 服务(即使尚未加载)
每个 systemd 单元(无论是服务、套接字还是其他单元)都有一个单元文件,
systemctl list-unit-files --type=service
您应该看到以下内容:
UNIT FILE STATE VENDOR PRESET
accounts-daemon.service enabled enabled
acpid.service disabled enabled
alsa-restore.service static enabled
alsa-state.service static enabled
alsa-utils.service masked enabled
anacron.service enabled enabled
apparmor.service enabled enabled
apport-autoreport.service static enabled
apport-forward@.service static enabled
解释每种状态类型会太冗长,不在本文的讨论范围内。也许以后我会写一些。
列出每次启动时自动运行的所有 systemd 服务
要查看每次系统启动时自动运行的所有 systemd 服务,请使用以下命令:
systemctl list-unit-files --type=service --state=enabled
您是否对启用状态感到困惑?这很正常。许多新用户会将启用的系统服务与正在运行的服务混淆。
但是,启用 systemd 服务意味着该服务将在系统启动时自动激活。
UNIT FILE STATE VENDOR PRESET
accounts-daemon.service enabled enabled
anacron.service enabled enabled
apparmor.service enabled enabled
autovt@.service enabled enabled
avahi-daemon.service enabled enabled
binfmt-support.service enabled enabled
bluetooth.service enabled enabled
console-setup.service enabled enabled
containerd.service enabled enabled
cron.service enabled enabled
cups-browsed.service enabled enabled
cups.service enabled enabled
dbus-fi.w1.wpa_supplicant1.service enabled enabled
您注意到供应商预设了吗?它也出现在前面的例子中。
供应商预设定义了安装程序时 systemd 单元的自动行为。
假设您安装了新程序 XYZ。此 XYZ 有一个名为 xyz.service 的 systemd 服务,并且启用了供应商预设。这意味着安装该程序后,当您启动系统时,此 xyz.service 将在启动时自动激活。
如果供应商预设被禁用,则必须手动将其设置为启用。一旦启用,它将在每次启动时自动启动。
sudo systemd enable xyz.service
显示特定 systemd 服务的状态
到目前为止,您已经了解了列出服务的各种方法。但没有一种方法可以专注于单一服务。
status
您可以使用systemctl 的子命令获取有关 systemd 服务的详细信息。此命令支持Tab 补全。
systemctl status <service_name>
以下是网络管理器服务的一个示例:
abhishek@itsfoss:~$ systemctl status NetworkManager.service
● NetworkManager.service - Network Manager
Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-07-23 08:12:44 IST; 3h 8min ago
Docs: man:NetworkManager(8)
Main PID: 711 (NetworkManager)
Tasks: 3 (limit: 9157)
Memory: 13.6M
CGroup: /system.slice/NetworkManager.service
└─711 /usr/sbin/NetworkManager --no-daemon
Jul 23 08:12:50 itsfoss NetworkManager[711]: <info> [1595472170.7159] device (wlp58s0): Activation: successful, device activated.
Jul 23 08:12:50 itsfoss NetworkManager[711]: <info> [1595472170.7179] manager: startup complete
Jul 23 08:12:51 itsfoss NetworkManager[711]: <info> [1595472171.5592] manager: NetworkManager state is now CONNECTED_GLOBAL
Jul 23 08:12:52 itsfoss NetworkManager[711]: <info> [1595472172.7973] dhcp6 (wlp58s0): activation: beginning transaction (timeout in 45 seconds)
Jul 23 08:12:52 itsfoss NetworkManager[711]: <info> [1595472172.8017] policy: set 'JioFi3_215810' (wlp58s0) as default for IPv6 routing and DNS
Jul 23 08:12:52 itsfoss NetworkManager[711]: <info> [1595472172.8058] dhcp6 (wlp58s0): option dhcp6_name_servers => 'fe80::a8dc:79ff:fe1b:57fe'
Jul 23 08:12:52 itsfoss NetworkManager[711]: <info> [1595472172.8059] dhcp6 (wlp58s0): state changed unknown -> bound
Jul 23 08:12:59 itsfoss NetworkManager[711]: <info> [1595472179.9251] agent-manager: agent[bdd71d4a66098713,:1.84/org.gnome.Shell.NetworkAgent/1>
Jul 23 11:18:10 itsfoss NetworkManager[711]: <info> [1595483290.7874] manager: NetworkManager state is now CONNECTED_SITE
Jul 23 11:18:11 itsfoss NetworkManager[711]: <info> [1595483291.5893] manager: NetworkManager state is now CONNECTED_GLOBAL
您可以看到它提供了大量有用的信息,例如服务状态、服务手册页、消耗的内存、进程 ID 等。它还显示服务的最后几个 journald 日志。
如果要在 shell 脚本中检查服务是否处于活动状态,可以使用is-active
子命令。输出为 0 表示活动。
systemctl is-active application.service
类似地,如果你想检查某个服务是否已启用(设置为在启动时自动启动),你可以使用is-enabled
子命令。输出为 0 表示服务已启用。
systemctl is-enabled application.service
结论
我想你现在对列出 systemd 服务有了更好的理解。我希望你学到了一些有关 systemd 和 systemctl 命令的新知识。
请随时在评论部分提供您的反馈、问题或建议。