Linux systemctl查看系统服务(附带实例)
从 Linux 7 版本开始,服务管理命令被统一成 systemctl 命令,这样做的优点是功能强大、管理方便,但是导致 systemctl 体系庞大、非常复杂。
借助 systemctl 命令,可以查询系统服务,包括:
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 选项:
再来看看查询自启动状态的 is-enabled 选项:
当然可以,使用以下的选项即可:
1) 我们可以查看已经启动的单元状态:
直接使用“systemctl list-units”会看到各种类型的单元状态,如果只关心 service 类型的状态,就可以进行如下操作:
我们也可以通过安装服务单元的分类来查看所有服务单元的状态,命令如下:
通过“systemctl list-units--all”查询只能按照服务单元分类进行大致查询,要想查询系统中所有已经安装的服务单元的状态,还需要使用 list-unit-files 选项:
借助 systemctl 命令,可以查询系统服务,包括:
- 查看服务状态;
- 查看系统中已经安装的服务单元;
- 查看系统服务依赖性。
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”是厂商预设值,并不干扰服务的正常状态。
自启动状态主要有以下几种:
- enabled:自启动,也就是服务在开机时会自动启动。
- disabled:禁止自启动,也就是服务在开机时不自动启动。
- static:静态状态,也就是服务在开机时不自动启动,但是可以被其他服务唤醒,类似于 Windows 服务中的手动状态。只有在服务的配置文件中没有定义 [Install] 区域时,服务才可以是 static 状态。
- mask:强制注销服务,在这种状态下的服务无法被启动,除非使用“systemctl unmask 单元”命令取消注销状态。
2) 第三行“Active:active(running)since Wed 2023-10-11 10:09:07 CST;29min ago”显示的是服务器的启动状态,这里的“active(running)”表示服务已经启动。
服务的启动状态主要分为以下几种:
- active(running):服务正在运行,常见的服务的启动状态就是这种状态。
- active(exited):只能执行一次就结束的服务。一般不需要一直常驻在内存中的服务,使用这种状态启动。
- active(waiting):正在等待运行的服务,需要等待其他服务运行结束,才能继续运行。打印队列服务一般都是这种状态。
- inactive:不活动状态,服务没有运行。
接下来这两个选项就简单多了,我们先来看看查询是否启动的 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 单元组等。