如何在Linux中列出系统服务
尽管systemd解决了系统管理中的许多问题,但有时也会造成混乱。
即使是列出系统服务的简单任务,也可能使我们产生思考。
在本文中,将介绍如何列出系统服务。
我还将解释输出,以便我们更容易理解服务的不同状态。
如何在systemd中列出活动服务
systemd服务由“ systemctl”命令管理。
如果我们不带任何参数运行systemctl
,它将调用默认的list-units
子命令,并列出各种类型的系统单元,例如服务,套接字,目标等。
但是目的是列出服务,因此我们可以使用--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:系统单位的名称。
- 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服务(即使未加载)
每个系统单元(无论是服务单元,套接字还是任何其他单元)都具有一个单元文件,该文件
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 Hyman@theitroad static enabled
解释每种状态类型将太冗长,不在本文讨论范围之内。
也许我以后会写。
列出将在每次引导时自动运行的所有系统服务
要查看每次系统引导时将自动运行的所有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 Hyman@theitroad 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的系统服务。
这意味着在安装程序之后,当我们引导系统时,此xyz.service将在引导时自动激活。
如果供应商预设被禁用,则必须手动将其设置为启用。
启用后,它将在每次引导时自动启动。
sudo systemd enable xyz.service
显示特定系统服务的状态
到目前为止,我们已经看到了各种列出服务的方式。
但是,没有什么可以集中在单一服务上。
我们可以使用systemctl的status
子命令获取有关systemd服务的详细信息。
tab补全功能与此命令一起使用。
systemctl status <service_name>
这是网络管理器服务的示例:
Hyman@theitroad:~$systemctl status NetworkManager.service ● NetworkManager.service - Network Manager Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2017-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 May 23 08:12:50 itstheitroad NetworkManager[711]: <info> [1595472170.7159] device (wlp58s0): Activation: successful, device activated. May 23 08:12:50 itstheitroad NetworkManager[711]: <info> [1595472170.7179] manager: startup complete May 23 08:12:51 itstheitroad NetworkManager[711]: <info> [1595472171.5592] manager: NetworkManager state is now CONNECTED_GLOBAL May 23 08:12:52 itstheitroad NetworkManager[711]: <info> [1595472172.7973] dhcp6 (wlp58s0): activation: beginning transaction (timeout in 45 seconds) May 23 08:12:52 itstheitroad NetworkManager[711]: <info> [1595472172.8017] policy: set 'JioFi3_215810' (wlp58s0) as default for IPv6 routing and DNS May 23 08:12:52 itstheitroad NetworkManager[711]: <info> [1595472172.8058] dhcp6 (wlp58s0): option dhcp6_name_servers => 'fe80::a8dc:79ff:fe1b:57fe' May 23 08:12:52 itstheitroad NetworkManager[711]: <info> [1595472172.8059] dhcp6 (wlp58s0): state changed unknown -> bound May 23 08:12:59 itstheitroad NetworkManager[711]: <info> [1595472179.9251] agent-manager: agent[bdd71d4a66098713,:1.84/org.gnome.Shell.NetworkAgent/1> May 23 11:18:10 itstheitroad NetworkManager[711]: <info> [1595483290.7874] manager: NetworkManager state is now CONNECTED_SITE May 23 11:18:11 itstheitroad 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