尽管 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
[email protected] 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
[email protected] 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
你注意到供应商预设了吗? 之前也出现过 example.
供应商预设定义了安装程序时 systemd 单元的自动行为。
假设您安装了一个新程序 XYZ。 这个 XYZ 有一个名为 xyz.service 的 systemd 服务,并启用了供应商预设。 这意味着安装程序后,当你启动系统时,这个 xyz.service 将在启动时自动激活。
如果供应商预设被禁用,您必须手动将其设置为启用。 一旦启用,它会在每次启动时自动启动。
sudo systemd enable xyz.service
显示特定 systemd 服务的状态
到目前为止,您已经看到了列出服务的各种方式。 但没有什么专注于单一服务。
您可以使用以下命令获取有关 systemd 服务的详细信息 status
systemctl 的子命令。 制表符补全适用于此命令。
systemctl status <service_name>
这是一个 example 使用网络管理器服务:
[email protected]:~$ 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 等。它还显示了服务的最后几个日志日志。
如果要在 shell 脚本中检查服务是否处于活动状态,可以使用 is-active
子命令。 输出为 0 表示激活。
systemctl is-active application.service
同样,如果要检查某个服务是否启用(设置为开机自动启动),可以使用 is-enabled
子命令。 启用服务的输出为 0。
systemctl is-enabled application.service
结论
我认为您现在对列出 systemd 服务有了更好的理解。 我希望你学到了一些关于 systemd 和 systemctl 命令的新东西。
不要犹豫,在评论部分提供您的反馈、问题或建议。