暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux 中如何列出所有 systemd 服务

TIAP 2022-09-06
2949

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 <service_name>

                                以下是网络管理器服务(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

                                      以上就是本次分享全部内容,欢迎讨论。


                                      文章转载自TIAP,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                      评论