如何在Linux中列出系统服务

时间:2020-03-05 15:29:51  来源:igfitidea点击:

尽管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