Systemctl 示例

下面介绍了如何使用 systemctl 命令来管理各种服务。

检查服务的状态

可以检查服务的当前状态,如下所示。

[jack@onitroad ~]# systemctl status chronyd.service
chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled)
   Active: active (running) since Mon 2014-08-24 15:52:20 AEST; 2 days ago
 Main PID: 718 (chronyd)
   CGroup: /system.slice/chronyd.service
           └─718 /usr/sbin/chronyd -u chrony

在这里我们可以看到 chronyd.service 单元当前处于“active (running) 活动(运行)”状态,并且该服务已启用,这意味着它当前配置为在系统启动时启动。
我们不需要每次都在服务末尾指定 .service ,因为默认情况下它会自动放在末尾,以后将省略它。

或者,我们也可以使用“is-active”来检查服务是否处于活动状态,这将显示该服务当前是否正在运行。

[jack@onitroad ~]# systemctl is-active chronyd
active

同样,我们还可以使用“is-enabled”检查服务是否已启用在启动时启动。

[jack@onitroad ~]# systemctl is-enabled chronyd
enabled

启动、停止和重启服务

Systemctl 可用于启动、停止和重新启动服务,如图所示。

这里我们停止 chronyd 服务并确认它不再主动运行。

[jack@onitroad ~]# systemctl stop chronyd
[jack@onitroad ~]# systemctl is-active chronyd
inactive

我们可以启动服务备份并确认它再次处于活动状态。

[jack@onitroad ~]# systemctl start chronyd
[jack@onitroad ~]# systemctl is-active chronyd
active

我们可以重新启动服务,而不是分两步执行停止然后启动。
如果我们在此之后检查服务的状态,则活动自时间将随着服务重新启动而更改,并且 PID 也将更改。

[jack@onitroad ~]# systemctl restart chronyd

如果我们尝试重新启动当前未主动运行的服务,它将启动。
相反,我们可以使用 'try-restart' 仅在服务当前正在运行时才执行重新启动。
如果该服务尚未运行并且我们使用“try-restart”,它将不会启动。

[jack@onitroad ~]# systemctl is-active chronyd
active
[jack@onitroad ~]# systemctl stop chronyd
[jack@onitroad ~]# systemctl is-active chronyd
inactive
[jack@onitroad ~]# systemctl try-restart chronyd
[jack@onitroad ~]# systemctl is-active chronyd
inactive
[jack@onitroad ~]# systemctl restart chronyd
[jack@onitroad ~]# systemctl is-active chronyd
active

可以重新加载服务,这只会刷新配置文件更改等内容,但主进程将继续运行,因此 PID 不会更改。

[jack@onitroad ~]# systemctl reload sshd

启用和禁用服务

如果启用了某个服务,它将在系统引导期间自动启动,但是如果禁用某个服务,它将不会在系统引导期间自动启动。
用户或者其他服务可以手动启动已禁用的服务。

下面我们可以看到 chronyd 服务已启用,禁用后符号链接被删除。
一旦禁用该服务仍将积极运行,但是如果系统重新启动,除非手动启动,否则该服务将不会启动。

[jack@onitroad ~]# systemctl is-enabled chronyd
enabled
[jack@onitroad ~]# systemctl disable chronyd
rm '/etc/systemd/system/multi-user.target.wants/chronyd.service'
[jack@onitroad ~]# systemctl is-enabled chronyd
disabled
[jack@onitroad ~]# systemctl is-active chronyd
active

当在系统引导期间启用该服务以启动时,将重新创建符号链接。

[jack@onitroad ~]# systemctl enable chronyd
ln -s '/usr/lib/systemd/system/chronyd.service' '/etc/systemd/system/multi-user.target.wants/chronyd.service'

如果我们尝试启用已启用的服务,它不会重新创建已存在的符号链接,因此不会有任何输出。
我们可以使用“reenable”重置符号链接,这将首先删除符号链接,然后重新创建它。

[jack@onitroad ~]# systemctl enable chronyd
[jack@onitroad ~]# systemctl reenable chronyd
rm '/etc/systemd/system/multi-user.target.wants/chronyd.service'
ln -s '/usr/lib/systemd/system/chronyd.service' '/etc/systemd/system/multi-user.target.wants/chronyd.service'

为了防止服务被用户或者其他服务自动和手动启动,我们可以屏蔽该服务。
屏蔽服务本质上将符号链接定向到 /dev/null 以便在使用它时不会发生任何事情。

[jack@onitroad ~]# systemctl mask chronyd
ln -s '/dev/null' '/etc/systemd/system/chronyd.service'

一旦服务被屏蔽,它就不会在启动时启动,也不能手动启动。
如果正在运行的进程被屏蔽,它将保持活动状态。

[jack@onitroad ~]# systemctl is-active chronyd
active
[jack@onitroad ~]# systemctl stop chronyd
[jack@onitroad ~]# systemctl start chronyd
Failed to issue method call: Unit chronyd.service is masked.

为了证明这一点,测试服务器在服务被屏蔽的情况下重新启动,并且在服务器重新启动后执行了服务状态,确认它没有运行。

[jack@onitroad ~]# systemctl status chronyd
chronyd.service
   Loaded: masked (/dev/null)
   Active: inactive (dead)
[jack@onitroad ~]# systemctl is-active chronyd
inactive

要扭转这种情况,可以取消屏蔽服务,然后可以成功启动它。

[jack@onitroad ~]# systemctl unmask chronyd
rm '/etc/systemd/system/chronyd.service'
[jack@onitroad ~]# systemctl start chronyd
[jack@onitroad ~]# systemctl is-active chronyd
active

查看所有服务的状态

可以使用以下命令查看所有服务的当前状态列表,删除 --all 以仅列出活动服务。

systemctl list-units --type service --all

可以查看所有服务的列表,以查看它们当前是否已使用以下命令启用。

systemctl list-unit-files --type service
如何使用 Systemctl 管理 Linux Systemd 服务

在许多基于 Linux 的操作系统中,例如 Debian 8、Red Hat Enterprise Linux (RHEL) 和 CentOS 7 systemd 现在是默认的 init 系统,用于服务管理。

日期:2020-07-07 20:56:26 来源:oir作者:oir