RH124|第九章 控制服务和守护进程
识别自动启动的系统进程
目标
完成这一部分后,你能够列出由systemd服务和socket单元启动的系统守护进程和网络服务。
systemd简介
systemd守护进程管理Linux的启动,包括服务启动和服务管理。它在启动时和运行中的系统中激活系统资源、服务器守护进程和其他进程。
守护进程是在后台等待或运行,执行各种任务的进程。一般来说,守护进程在启动时自动启动,并继续运行,直到关机或手动停止。许多守护进程的名称都是以字母d结尾,这是一个惯例。
在systemd意义上的服务通常指一个或多个守护进程,但启动或停止服务可能会对系统状态进行一次性更改,这不涉及让守护进程在之后运行(称为oneshot)
在Red Hat Enterprise Linux中,第一个启动的进程(PID 1)是systemd。systemd所提供的一些功能包括:
并行化功能(同时启动多个服务),可提高系统的启动速度。
按需启动守护进程,不需要单独的服务。
自动服务依赖管理,可以防止长时间超时。例如,依赖网络的服务在网络可用之前不会尝试启动。
利用Linux控制组跟踪相关进程的一种方法。
描述服务单元
systemd使用单元来管理不同类型的对象。下面列出了一些常见的单元类型:
服务单元有一个.service扩展名,代表系统服务。这种类型的服务单元用于启动经常访问的守护进程,例如web服务器。
Socket单元有一个.socket扩展名,代表systemd应该监控的进程间通信(IPC)套接字。如果客户端连接到套接字,systemd会启动一个守护进程并将连接传递给它。套接字单元用于延迟启动服务的启动时间,并按需启动不常用的服务。
路径单元具有.Path扩展名,用于延迟服务的激活,直到发生特定的文件系统更改。这通常用于使用假脱机目录(如打印系统)的服务。
systemctl命令用于管理单元。例如,用systemctl -t help命令显示可用的单元类型。
列出服务单元
您可以使用systemctl命令来探索系统的当前状态。例如,下面这条命令列出了所有当前加载的服务单元,用less分页输出。
[root@host ~]# systemctl list-units --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running Job spooling tools auditd.service loaded active running Security Auditing Service chronyd.service loaded active running NTP client/server
crond.service loaded active running Command Scheduler
dbus.service loaded active running D-Bus System Message Bus ...output omitted...
上面的输出将列出的单元类型限制在--type=service选项下的服务单元。该输出有以下几列:
systemctl list-units命令中的列输出
UNIT:服务单元的名称。
LOAD:Systemd是否正确解析了单元的配置并将单元加载到内存中。
ACTIVE:设备的高级激活状态。 此信息指示设备是否已成功启动。
SUB:设备的低级激活状态。 此信息指示有关该设备的更多详细信息。 该信息根据单元类型,状态和单元执行方式而有所不同。
DESCRIPTION:单元的简要说明。
默认情况下,systemctl list-units --type=service命令只列出激活状态的服务单元。而 --all 选项则列出了所有的服务单元,无论激活状态如何。使用 --state= 选项可以根据 LOAD、ACTIVE 或 SUB 字段中的值进行过滤。
[root@host ~]# systemctl list-units --type=service --all
UNIT LOAD ACTIVE SUB DESCRIPTION a
td.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing ...
auth-rpcgss-module.service loaded inactive dead Kernel Module ... chronyd.service loaded active running NTP client/server cpupower.service loaded inactive dead Configure CPU power ...
crond.service loaded active running Command Scheduler
dbus.service loaded active running D-Bus System Message Bus
● display-manager.service not-found inactive dead display-manager.service ...output omitted...
没有任何参数的systemctl命令列出了正在加载和活动的单元。
[root@host ~]# systemctl
UNIT LOAD ACTIVE SUB
DESCRIPTION proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary... sys-devices-....device loaded active plugged Virtio network...
sys-subsystem-net-devices-ens3.deviceloaded active plugged Virtio network... ...
-.mount loaded active mounted Root Mount
boot.mount loaded active mounted /boot
...
systemd-ask-password-plymouth.path loaded active waiting Forward Password...
systemd-ask-password-wall.path loaded active waiting Forward Password... init.scope loaded active running System and Servi...
session-1.scope loaded active running Session 1 of...
atd.service loaded active running Job spooling tools auditd.service loaded active running Security Auditing... chronyd.service loaded active running NTP client/server crond.service loaded active running Command Scheduler
...output omitted...
systemctl list-units 命令显示的是 systemd 服务试图解析并加载到内存中的单元;它不显示已安装但未启用的服务。要查看所有已安装的单元文件的状态,请使用 systemctl list-unit-files 命令。例如;
[root@host ~]# systemctl list-unit-files --type=service
UNIT FILE STATE
arp-ethers.service disabled
atd.service enabled
auditd.service enabled
auth-rpcgss-module.service static
autovt@.service enabled
blk-availability.service disabled ...output omitted...
在 systemctl list-units-files 命令的输出中,STATE 字段的有效条目有enabled、disabled、static和masked。
查看服务状态
使用 systemctl status name.type 查看特定单元的状态。如果没有提供单元类型,systemctl将显示一个服务单元的状态,如果存在的话,则显示该服务单元的状态。
[root@host ~]# systemctl status sshd.service
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset:
enabled) Active: active (running) since Thu 2019-02-14 12:07:45 IST; 7h ago
Main PID: 1073 (sshd)
CGroup: /system.slice/sshd.service └─1073 /usr/sbin/sshd -D ...
Feb 14 11:51:39 host.example.com systemd[1]: Started OpenSSH server daemon.
Feb 14 11:51:39 host.example.com sshd[1073]: Could not load host key: /et...y Feb 14 11:51:39 host.example.com sshd[1073]: Server listening on 0.0.0.0 ....
Feb 14 11:51:39 host.example.com sshd[1073]: Server listening on :: port 22.
Feb 14 11:53:21 host.example.com sshd[1270]: error: Could not load host k...y Feb 14 11:53:22 host.example.com sshd[1270]: Accepted password for root f...2
...output omitted...
该命令显示服务的当前状态。这些字段的含义是:
服务单元信息
参数 | 描述 |
---|---|
Loaded | 服务单元是否加载到内存中。 |
Active | 服务单元是否在运行,如果是,运行了多长时间。 |
Main PID | 服务的主进程ID,包括命令名称。 |
Status | 关于该服务的其他信息。 |
在状态输出中可以找到几个表示服务状态的关键词。
Systemctl输出中的服务状态
关键字 | 描述 |
---|---|
loaded | 单位配置文件已经处理完毕。 |
active (running) | 与一个或多个持续进程一起运行。 |
active (exited) | 成功完成了一次性配置。 |
active (waiting) | 运行,但在等待一个活动。 |
inactive | 没运行。 |
enabled | 启用开机时启动。 |
disabled | 禁用开启启动。 |
static | 不能启用,但可由启用的单元自动启动。 |
systemctl status NAME 命令取代了 Red Hat Enterprise Linux 6 及更早版本中使用的service NAME status命令。
验证服务状态
systemctl命令提供了验证服务的特定状态的方法。例如,使用下面的命令来验证一个服务单元当前是否处于活动状态(运行中):
[root@host ~]# systemctl is-active sshd.service
active
该命令返回服务单元的状态,通常是活动或非活动状态。
运行以下命令,验证系统启动时是否启用了服务单元自动启动。
[root@host ~]# systemctl is-enabled sshd.service
enabled
该命令返回服务单元在启动时是否启用,通常是enabled 或disabled。
要验证设备在启动期间是否失败,请运行以下命令。
[root@host ~]# systemctl is-failed sshd.service
active
如果设备正常运行,该命令会返回 active 状态,如果在启动过程中发生错误,则会返回活动状态;如果在启动过程中发生错误,则会返回 failed 状态。如果设备被停止,则返回 unknown 或inactive。
要列出所有失败的设备,请运行 systemctl --failed --type=service 命令。
控制系统服务
目标
完成本节内容后,你应该能够使用systemctl控制系统守护进程和网络服务。
启动和停止服务
服务需要手动停止或启动的原因有很多:可能是服务需要更新;可能是服务的配置文件需要更改;或者是服务需要卸载;或者是管理员手动启动不常用的服务。
要启动一个服务,首先以systemctl status检查服务是否运行。然后,以root用户的身份使用systemctl start命令(必要时使用sudo)。下面的例子显示了如何启动 sshd.service 服务。
[root@host ~]# systemctl start sshd.service
systemd服务在没有服务类型与服务名称的服务类型的命令中寻找.service文件进行服务管理。因此,上面的命令可以执行为:
[root@host ~]# systemctl start sshd
要停止当前运行的服务,请使用 systemctl 命令中的 stop 参数。下面的例子显示了如何停止 sshd.service 服务。
重启和重载服务
在重新启动一个运行中的服务时,服务会被停止,然后再启动。在重新启动服务时,进程ID会发生变化,并在启动时关联一个新的进程ID。要重启一个运行中的服务,请使用 systemctl 命令中的 restart 参数。下面的例子显示了如何重启 sshd.service 服务:
[root@host ~]# systemctl restart sshd.service
有些服务具有重新加载配置文件的能力,而不需要重新启动。这个过程被称为服务重载。重载服务并不会改变与各种服务进程相关联的进程ID。要重新加载一个正在运行的服务,请使用systemctl命令中的reload参数。下面的例子显示了如何在配置更改后重新加载 sshd.service 服务:
[root@host ~]# systemctl reload sshd.service
如果你不确定服务是否具有重载配置文件更改的功能,请使用systemctl命令中的reload-or-restart参数。如果重载功能可用,则该命令会重载配置更改。否则,该命令将重新启动服务,以实现新的配置更改。
[root@host ~]# systemctl reload-or-restart sshd.service
查看单元的依赖
有些服务需要先运行其他服务,会对其他服务产生依赖性。而其他的服务则不是在启动时启动,而是按需启动。在这两种情况下,systemd和systemctl会根据需要启动服务,不管是为了解决依赖关系还是为了启动一个不常用的服务。例如,如果CUPS打印服务没有运行,并且有一个文件被放到打印假脱机目录中,那么系统会启动CUPS相关的守护进程或命令来满足打印请求。
root@host ~]# systemctl stop cups.service
Warning: Stopping cups, but it can still be activated by:
cups.path
cups.socket
要完全停止系统上的打印服务,请停止所有三个单元。禁用该服务将禁用依赖性服务。
systemctl list-dependencies UNIT命令显示了一个依赖关系的层次结构映射,以启动服务单元。要列出反向依赖关系(依赖指定单元的单元),请使用命令中的 --reverse 选项。
[root@host ~]# systemctl list-dependencies sshd.service sshd.service ● ├─system.slice
● ├─sshd-keygen.target
● │ ├─sshd-keygen@ecdsa.service
● │ ├─sshd-keygen@ed25519.service
● │ └─sshd-keygen@rsa.service
● └─sysinit.target
...output omitted...
屏蔽和解锁服务
有时候,一个系统可能会安装不同的服务,而这些服务是相互冲突的。
例如,有多种方法来管理邮件服务器(例如postfix和sendmail)。屏蔽一个服务可以防止管理员意外启动与其他服务冲突的服务。屏蔽会在配置目录中创建一个链接到/dev/null文件,防止服务启动。
[root@host ~]# systemctl mask sendmail.service
Created symlink /etc/systemd/system/sendmail.service → /dev/null.
[root@host ~]# systemctl list-unit-files --type=service
UNIT FILE STATE
...output omitted...
sendmail.service masked
...output omitted...
试图启动屏蔽服务单元时失败,输出如下。
[root@host ~]# systemctl start sendmail.service
Failed to start sendmail.service: Unit sendmail.service is masked.
使用 systemctl unmask 命令解除服务单元的屏蔽。
[root@host ~]# systemctl unmask sendmail
Removed /etc/systemd/system/sendmail.service.
自启服务在引导时启动或停止
在运行中的系统上启动一个服务并不能保证在系统重启时自动启动服务。同样的,在运行中的系统上停止一个服务,并不能保证在系统重启时,服务会再次启动。在systemd配置目录中创建链接可以使服务在启动时启动。systemctl命令可以创建和删除这些链接。
要在引导时启动一个服务,请使用 systemctl enable 命令。
[root@root ~]# systemctl enable sshd.service
Created symlink /etc/systemd/system/multi-user.target.wants/sshd.service → /usr/ lib/systemd/system/sshd.service.
上面的命令从服务单元文件(通常在/usr/lib/system/systemd/system目录下)到systemd查找文件的位置(在/etc/systemd/systemd/system/TARGETNAME.target.wants目录下)创建一个符号链接。启用服务并不会在当前会话中启动服务。要启动服务并使其在启动时自动启动,请执行 systemctl start 和 systemctl enable 命令。
要禁用服务自动启动,请使用下面的命令,删除启用服务时创建的符号链接。注意,禁用服务并不会停止服务。
[root@host ~]# systemctl disable sshd.service Removed /etc/systemd/system/multi-user.target.wants/sshd.service.
要验证服务是启用还是禁用,请使用 systemctl is-enabled 命令。
systemctl指令的总结
可以在运行中的系统上启动和停止服务,也可以在启动时启用或禁用服务以自动启动。
常用的服务管理命令
命令 | 作用 |
---|---|
systemctl status UNIT | 查看服务状态的详细信息。 |
systemctl stop UNIT | 在运行中的系统上停止一个服务。 |
systemctl start UNIT | 在运行中的系统上启动一个服务。 |
systemctl restart UNIT | 在运行中的系统上重启一个服务。 |
systemctl reload UNIT | 在运行中的系统上重载一个服务。 |
systemctl mask UNIT | 在手动和开机时,完全禁止启动服务。 |
systemctl unmask UNIT | 解锁一个被屏蔽的服务 |
systemctl enable UNIT | 配置一个服务在开机时启动。 |
systemctl disable UNIT | 在开机时禁止启动服务。 |
systemctl list-dependencies UNIT | 列出指定服务的依赖 |
总结
- systemd提供了一种在启动时和运行系统中激活系统资源、服务器守护程序和其他进程的方法。
- 使用**systemctl **来启动、停止、重新加载、启用和禁用服务。
- 使用systemctl status命令来确定系统守护进程和网络服务的状态。
- systemctl list-dependencies命令列出了特定服务单元所依赖的所有服务单元。
- systemd可以屏蔽一个服务,使其即使是为了满足依赖关系也不运行。