首页 > 编程笔记 > Linux笔记 阅读:95

Linux systemctl查看系统服务(附带实例)

从 Linux 7 版本开始,服务管理命令被统一成 systemctl 命令,这样做的优点是功能强大、管理方便,但是导致 systemctl 体系庞大、非常复杂。

借助 systemctl 命令,可以查询系统服务,包括:
  1. 查看服务状态;
  2. 查看系统中已经安装的服务单元;
  3. 查看系统服务依赖性。

Linux查看服务状态

在 Linux 中,查询服务的启动与自启动状态,通过执行以下命令实现:
[root@localhost ~]# systemctl [选项] 单元名
选项:
    status:     查询单元的状态,可以看到启动状态与自启动状态
    is-active:  查询单元是否启动
    is-enabled: 查询单元是否自启动
查询服务状态:
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   # 服务的自启动状态(开机不自启动,厂商预设值)

   Active: active (running) since Wed 2023-10-11 10:09:07 CST; 23min ago
   # 服务的启动状态(已启动)

   Docs: man:httpd.service(8)
   # 命令帮助

Main PID: 28278 (httpd)
   Status: "Total requests: 0; Idle/Busy workers 100/0; Requests/sec: 0; Bytes served/sec: 0 B/sec"
   Tasks: 213 (limit: 5691)
   Memory: 39.3M
   CPU: 785ms
   CGroup: /system.slice/httpd.service
           ├─28278 /usr/sbin/httpd -DFOREGROUND
           ├─28279 /usr/sbin/httpd -DFOREGROUND
           ├─28280 /usr/sbin/httpd -DFOREGROUND
           ├─28281 /usr/sbin/httpd -DFOREGROUND
           └─28284 /usr/sbin/httpd -DFOREGROUND
   # 服务单元的进程PID信息

Oct 11 10:09:07 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
Oct 11 10:09:07 localhost.localdomain httpd[28278]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name
Oct 11 10:09:07 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
Oct 11 10:09:07 localhost.localdomain httpd[28278]: Server configured, listening on: port 80
# 服务的日志信息
通过 status 选项得到的输出比较多,下面来解释一下:
1) 第二行“Loaded:loaded(/usr/lib/systemd/system/httpd.service;disabled;vendor preset:disabled)”显示的是服务的自启动状态。其中前半行,也就是“/usr/lib/systemd/system/httpd.service;disabled;”指的是当前服务的自启动状态,这里的“disabled”指的是服务开机不自启动;后半行“vendor preset:disabled”是厂商预设值,并不干扰服务的正常状态。

自启动状态主要有以下几种:
2) 第三行“Active:active(running)since Wed 2023-10-11 10:09:07 CST;29min ago”显示的是服务器的启动状态,这里的“active(running)”表示服务已经启动。

服务的启动状态主要分为以下几种:
接下来这两个选项就简单多了,我们先来看看查询是否启动的 is-active 选项:
[root@localhost ~]# systemctl stop httpd.service
# 停止Apache服务

[root@localhost ~]# systemctl is-active httpd.service
inactive
# 服务状态是未激活,也就是未启动

[root@localhost ~]# systemctl start httpd.service
# 启动Apache服务

[root@localhost ~]# systemctl is-active httpd.service
active
# 服务状态是激活,也就是已经启动

再来看看查询自启动状态的 is-enabled 选项:
[root@localhost ~]# systemctl enable httpd.service
# 设置Apache服务开机自启动

[root@localhost ~]# systemctl is-enabled httpd.service
enabled
# 服务自启动状态是enabled,也就是开机自启动此服务

[root@localhost ~]# systemctl disable httpd.service
# 禁止Apache服务自启动

[root@localhost ~]# systemctl is-enabled httpd.service
disabled
# 服务自启动状态是disabled,也就是开机不自启动此服务
其实,is-active 选项和 is-enabled 选项完全可以被 status 选项取代,大家可以按照自己的习惯来使用。

Linux查看系统中已经安装的服务单元

通过 status 选项查询服务状态,需要手工指定单元的名称,只能一个个地进行查询。那么,是否可以查询系统中所有已经安装的单元状态呢?

当然可以,使用以下的选项即可:
[root@localhost ~]# systemctl [list-units | list-unit-files]
选项:
    list-units:列出已经启动的服务单元,没有启动的服务单元不会列出。可以使用 --all 选项列出所有服务单元,包括没有启动的服务单元
    list-unit-files:按照 /usr/lib/systemd/system/ 目录中的服务单元,列出所有服务单元的状态,包括启动与未启动的服务单元
    --type=TYPE:按照类型列出服务单元,常见服务单元类型如 service、socket、target 等
举几个例子:
1) 我们可以查看已经启动的单元状态:
[root@localhost ~]# systemctl list-units
# 列出已经启动的服务单元
UNIT                        LOAD   ACTIVE SUB       DESCRIPTION
...省略部分内容...
httpd.service               loaded active running   The Apache HTTP Server
...省略部分内容...
# 服务单元名  加载状态  启动状态  描述
如果 Apache 已经启动,那么使用“systemctl list-units”命令就可以查看 Apache 的状态。注意,“systemctl list-units”命令看到的是服务的启动状态。

直接使用“systemctl list-units”会看到各种类型的单元状态,如果只关心 service 类型的状态,就可以进行如下操作:
[root@localhost ~]# systemctl list-units --type=service
# 只查看service类型的服务单元状态

我们也可以通过安装服务单元的分类来查看所有服务单元的状态,命令如下:
[root@localhost ~]# systemctl list-units --all

通过“systemctl list-units--all”查询只能按照服务单元分类进行大致查询,要想查询系统中所有已经安装的服务单元的状态,还需要使用 list-unit-files 选项:
[root@localhost ~]# systemctl list-unit-files
UNIT FILE                          STATE
proc-sys-fs-binfmt_misc.automount  static
dev-hugepages.mount                static
...省略部分内容...
tmp.mount                          disabled
brandbot.path                      disabled
...省略部分内容...
abrt-ccpp.service                  enabled
abrt-oops.service                  enabled
...省略部分内容...
#单元名                            自启动状态
通过“systemctl list-unit-files”命令查询到的状态,就是之前我们说的自启动状态,主要有 enabled、disabled、static、mask 等。

Linux查看系统服务依赖性

服务单元之前是存在依赖关系的,也就是说,如果服务单元 A 依赖服务单元 B,那么在启动服务单元 A 之前需要先启动服务单元 B。而我们也可以追踪这种依赖关系,例如,目前使用的是字符界面 multi-user.target 单元组,现在看看要想启动 multi-user.target 单元组,必须先启动哪些服务单元:
[root@localhost ~]# systemctl list-dependencies multi-user.target
multi-user.target
├─abrt-ccpp.service
├─abrt-oops.service
├─abrt-vmcore.service
├─abrt-xorg.service
├─abrtd.service
├─atd.service
├─auditd.service
├─crond.service
...省略部分内容...
├─basic.target
│ ├─microcode.service
│ ├─rhel-dmesg.service
│ ├─selinux-policy-migrate-local-changes@targeted.service
│ ├─paths.target
│ ├─slices.target
│ │ ├─-.slice
│ │ └─system.slice
│ ├─sockets.target
│ │ └─dbus.socket
...省略部分内容...
├─sysinit.target
│ ├─dev-hugepages.mount
│ ├─dev-mqueue.mount
...省略部分内容...
├─local-fs.target
│ ├─-.mount
│ ├─boot.mount
│ └─rhel-readonly.service
├─systemd-remount-fs.service
├─swap.target
├─timers.target
│ └─systemd-tmpfiles-clean.timer
├─getty.target
│ └─getty@tty1.service
└─remote-fs.target
单元组的依赖性可以帮助我们理解服务单元之间的依赖关系,也有助于理解服务的启动过程。我们系统的默认单元组是 multi-user.target,可以看到,要想启动 multi-user.target 单元组,就需要先启动 basic.target 单元组、getty.target 单元组、remote-fs.target 单元组等。而要想启动 basic.target 单元组,又需要先启动 slices.target 单元组、sockets.target 单元组、sysinit.target 单元组、timers.target 单元组等。

相关文章