systemd 负责解决系统管理中的很多问题。对于很多新手来说,对它可能不够熟悉。比如,怎样列出 systemd 的服务,可能就会让你想半天。
本文将介绍如何列出 systemd 服务,并解释它的输出,以便大家能更容易理解服务的不同状态。
systemd 服务由 systemctl 命令管理。如果我们不带任何参数运行 systemctl,它会默认调用 list-units 子命令,列出各种类型的 systemd 单元,比如服务(services)、套接字(sockets)、目标(targets)等。
但是我们的目的是要列出服务,所以可以使用 --type选项指定单元类型(unit type),如下所示:
systemctl --type=service
是否注意到我没有指定 list-units 子命令?因为它是默认的。如果想要按照约定使用,也可以指定。本文后面的部分会遵循这种约定。
systemctl list-units --type=service
上述两个命令输出是一样的。默认情况下,该命令会按照字母顺序列出已经加载且活动的服务:
UNIT LOAD ACTIVE SUB DESCRIPTIONaccounts-daemon.service loaded active running Accounts Serviceacpid.service loaded active running ACPI event daemonalsa-restore.service loaded active exited Save/Restore Sound Card Stateapparmor.service loaded active exited Load AppArmor profilesapport.service loaded active exited LSB: automatic crash report generation
我们来解释一下上述输出中的内容:
UNIT:systemd 单元名称;
LOAD:单元配置文件是否已由 systemd 解析;
ACTIVE:单元的高级别状态(high level state);
SUB:单元的低级别状态。活动单元(active unit)可以处于运行状态(running state)或退出状态(exited state),此值取决于服务类型。
上面的例子,我们可以列出 Linux 系统上加载的服务。但活动的 systemd 服务可能正在运行,也可能已经退出(在成功运行后)。
列出所有正在运行的systemd服务
活动状态(active state)也有一个子状态(sub-status),比如正在运行(running)、已退出(exited)等。所以,可以在子状态中使用 --state 选项。
要列出正在运行的 systemd 服务,可以指明 --state=running,如下:
systemctl list-units --type=service --state=running
以下是一个输出的例子,列出了正在运行的 systemd 服务:
UNIT LOAD ACTIVE SUB DESCRIPTIONaccounts-daemon.service loaded active running Accounts Serviceacpid.service loaded active running ACPI event daemonavahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stackbluetooth.service loaded active running Bluetooth servicebolt.service loaded active running Thunderbolt system service
列出所有已加载的systemd服务,包括非活动服务
默认情况下,systemctl 命令只列出已加载且活动的服务。如果要包含非活动的 服务,可以使用 --all 选项:
systemctl list-units --all --type=service
如下输出示例:
UNIT LOAD ACTIVE SUB DESCRIPTIONaccounts-daemon.service loaded active running Accounts Serviceacpid.service loaded active running ACPI event daemonalsa-restore.service loaded active exited Save/Restore Sound Card Statealsa-state.service loaded inactive dead Manage Sound Card State (restore and store)anacron.service loaded inactive dead Run anacron jobsapparmor.service loaded active exited Load AppArmor profiles
列出所有非活动的systemd服务
如果要列出所有非活动的 systemd 服务,可以使用 --all 组合 --state 选项,如下:
systemctl list-units --all --type=service --state=inactive
如下为结果的输出,只列出了非活动的 systemd 服务:
UNIT LOAD ACTIVE SUB DESCRIPTIONalsa-state.service loaded inactive dead Manage Sound Card State (restore and store)anacron.service loaded inactive dead Run anacron jobsapport-autoreport.service loaded inactive dead Process error reports when automatic reporting is enabledapt-daily-upgrade.service loaded inactive dead Daily apt upgrade and clean activitiesapt-daily.service loaded inactive dead Daily apt download activities● auditd.service not-found inactive dead auditd.service
列出所有已安装的systemd服务(即使未加载)
每一个 systemd 单元,包括服务(service),套接字(socket)或者其他的,都会有一个单元文件(unit file),所以我们可以利用其单元文件,列出所有已安装的 systemd 服务:
systemctl list-unit-files --type=service
以下是输出:
UNIT FILE STATE VENDOR PRESETaccounts-daemon.service enabled enabledacpid.service disabled enabledalsa-restore.service static enabledalsa-state.service static enabledalsa-utils.service masked enabledanacron.service enabled enabledapparmor.service enabled enabledapport-autoreport.service static enabledapport-forward@.service static enabled
列出系统启动时会自动运行的 systemd 服务
要查看系统启动时,会自动运行的 systemd 服务,可以使用如下命令:
systemctl list-unit-files --type=service --state=enabled
你可能会对上述命令中,指定的状态为 enabled 有疑问,这很正常,很多新用户经常会将服务的“启用(enabled)”和“正在运行(running)”混淆。
这里,enabled systemd 服务表示系统启动时会自动激活该服务。
以下为输出:
UNIT FILE STATE VENDOR PRESETaccounts-daemon.service enabled enabledanacron.service enabled enabledapparmor.service enabled enabledautovt@.service enabled enabledavahi-daemon.service enabled enabledbinfmt-support.service enabled enabledbluetooth.service enabled enabledconsole-setup.service enabled enabledcontainerd.service enabled enabledcron.service enabled enabledcups-browsed.service enabled enabledcups.service enabled enableddbus-fi.w1.wpa_supplicant1.service enabled enabled
注意到结果中的 Vendor Preset 一列了吗?它在前一个例子中也出现了。
Vendor preset 定义了安装程序时 systemd 单元的自动行为。
假设我们安装了一个新程序 XYZ,它有一个名为 xyz.service的服务,且 vendor preset状态为启用(enabled),这表示当启动系统时,xyz.service将会被自动激活。
如果 vendor preset 设置为 disabled,则必须手动设置为启用。一旦启用,他就会跟随系统自动启动。
sudo systemd enable xyz.service
显示某个特定 systemd 服务的状态
上文我们介绍了几种列出服务的方法。那么,怎样查看某一个服务的状态呢?
可以使用 systemctl 命令的子命令 status 来查看 systemd 服务的详细信息。使用该命令时,tab 键会补全输入。
systemctl status <service_name>
以下是网络管理器服务(network manager service)的例子:
$ systemctl status NetworkManager.service● NetworkManager.service - Network ManagerLoaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)Active: active (running) since Thu 2020-07-23 08:12:44 IST; 3h 8min agoDocs: man:NetworkManager(8)Main PID: 711 (NetworkManager)Tasks: 3 (limit: 9157)Memory: 13.6MCGroup: /system.slice/NetworkManager.service└─711 /usr/sbin/NetworkManager --no-daemonJul 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 completeJul 23 08:12:51 itsfoss NetworkManager[711]: <info> [1595472171.5592] manager: NetworkManager state is now CONNECTED_GLOBALJul 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 DNSJul 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 -> boundJul 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_SITEJul 23 11:18:11 itsfoss NetworkManager[711]: <info> [1595483291.5893] manager: NetworkManager state is now CONNECTED_GLOBAL
上面例子中,我们可以看到它显示了很多信息,比如服务的状态、man 手册中的页码、内存使用情况、进程ID等,后面还显示了服务的最后的几个日志信息。
如果我们要在 shell 脚本中检查服务是否处于活动(active)状态,可以使用 is-active 子命令,0 表示已激活(active)。
systemctl is-active application.service
类似的,如果要检查服务是否已启用(设置为自启动),可以使用 is-enabled 子命令,0 表示已启用:
systemctl is-enabled application.service
以上就是本次分享全部内容,欢迎讨论。




