如何在 Linux 中列出 Systemd 服务

尽管 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 命令的新东西。

不要犹豫,在评论部分提供您的反馈、问题或建议。