systemd 负责解决系统管理中的很多问题。对于很多新手来说,对它可能不够熟悉。比如,怎样列出 systemd 的服务,可能就会让你想半天。
本文将介绍如何列出 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 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 :单元的高级别状态(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 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服务
如果要列出所有非活动的 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 单元,包括服务(service),套接字(socket)或者其他的,都会有一个单元文件(unit file),所以我们可以利用其单元文件,列出所有已安装的 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
你可能会对上述命令中,指定的状态为 enabled 有疑问,这很正常,很多新用户经常会将服务的“启用(enabled)”和“正在运行(running)”混淆。
这里,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
注意到结果中的 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
以下是网络管理器服务(network manager service)的例子:
$ 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
上面例子中,我们可以看到它显示了很多信息,比如服务的状态、man 手册中的页码、内存使用情况、进程ID等,后面还显示了服务的最后的几个日志信息。
如果我们要在 shell 脚本中检查服务是否处于活动(active)状态,可以使用 is-active 子命令,0 表示已激活(active)。
systemctl is-active application.service
类似的,如果要检查服务是否已启用(设置为自启动),可以使用 is-enabled 子命令,0 表示已启用:
systemctl is-enabled application.service
以上就是本次分享全部内容,欢迎讨论。
审核编辑:刘清
-
Linux系统
+关注
关注
4文章
593浏览量
27389 -
sub函数
+关注
关注
0文章
3浏览量
1009 -
unit技术
+关注
关注
0文章
2浏览量
1551
发布评论请先 登录
相关推荐
评论