在 RHEL 7/CentOS 7 中使用 systemctl 管理单元文件和服务

现在在RHEL 7 中的服务被命名为 something.service,例如 firewalld.service,并存储在 /lib/systemd/system、/usr/lib/systemd/system/和/etc/systemd/system 目录。

单元配置文件对有关服务、套接字、设备、挂载点、自动挂载点、交换文件或者分区、启动目标、监视的文件系统路径、由 systemd 控制和监督的计时器的信息进行编码。

11.查看一个单元文件的内容

您可以使用“cat”标志查看各个服务拥有的单位文件的内容

cat 模式
显示一个或者多个单元的备份文件。打印单元的“片段”和“下拉列表”(源文件)。每个文件前面都有一条注释,其中包括文件名。

如下所示:

[root@onitroad ~]# systemctl cat sshd.service
 # /usr/lib/systemd/system/sshd.service
 [Unit]
 Description=OpenSSH server daemon
 Documentation=man:sshd(8) man:sshd_config(5)
 After=network.target sshd-keygen.service
 Wants=sshd-keygen.service

[Service]
 Type=notify
 EnvironmentFile=/etc/sysconfig/sshd
 ExecStart=/usr/sbin/sshd -D $OPTIONS
 ExecReload=/bin/kill -HUP $MAINPID
 KillMode=process
 Restart=on-failure
 RestartSec=42s

[Install]
 WantedBy=multi-user.target

6.检查服务是否启用或者禁用

如上所述,如果服务已处于启用状态并且我们尝试重新启用它,则输出将为空白。

因此,使用以下命令我们可以检查服务是否已启用或者禁用

检查服务是否已启用的语法

systemctl is-enabled something.service

检查服务是否已启用

[root@onitroad ~]# systemctl is-enabled nfs-server.service
 enabled

如果服务处于禁用状态,则输出如下

[root@onitroad ~]# systemctl is-enabled nfs-server.service
 disabled

8. 列出特定目标的依赖项

查看哪些服务和其他单元(服务、装载、路径、套接字等)与特定目标关联,并配置为指定目标的依赖项。

[root@onitroad ~]# 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
 ...

该列表显示了作为该目标依赖项的服务和单元文件列表,并且要启动到该目标级别,将调用这些服务和单元文件列表。

2. 启动或者停止服务

要启动服务,请使用以下语法

systemctl start something.service

例如启动 nfs-server.service”

[root@onitroad ~]# systemctl start nfs-server.service

类似地停止服务使用以下语法

systemctl stop something.service

例如停止“nfs-server.service”

[root@onitroad ~]# systemctl stop nfs-server.service

1.查看服务状态

要检查服务的状态,请使用以下语法

systemctl status something.service

例如检查“nfs-server.service”的服务状态

[root@onitroad ~]# systemctl status nfs-server.service
 ● nfs-server.service - NFS server and services
 Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
 Active: active (exited) since Mon 2015-12-25 19:19:55 IST; 4min 45s ago
 Process: 1027 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
 Process: 1009 ExecStartPre=/bin/sh -c /bin/kill -HUP `cat /run/gssproxy.pid` (code=exited, status=0/SUCCESS)
 Process: 1001 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 1027 (code=exited, status=0/SUCCESS)
 CGroup: /system.slice/nfs-server.service

您还有两个标志可用于检查服务是否处于活动状态

  1. is-active PATTERN...
    检查是否有任何指定的单元处于活动状态(即正在运行)。 如果至少有一个是活动的,则返回退出代码 0,否则返回非零。 除非指定 --quiet ,否则这也会将当前单元状态打印到标准输出。

  2. is-failed PATTERN...
    检查是否有任何指定的单元处于“失败”状态。 如果至少有一个失败,则返回退出代码 0,否则返回非零。 除非指定 --quiet ,否则这也会将当前单元状态打印到标准输出。

示例: 使用以下命令检查服务是否处于活动状态

[root@onitroad ~]# systemctl is-active nfs-server.service
 active
You may get below output if the service is not running
[root@onitroad ~]# systemctl is-active nfs-server.service
 inactive
You can also use "is-failed" flag as shown below
[root@onitroad ~]# systemctl is-failed nfs-server.service
 inactive

4. 重新加载或者重启服务

我们可以要求 systemd 检查单元文件是否支持“重新加载”或者使用以下标志相应地执行“重新启动”

reload-or-restart启动模式..

重新加载一个或者多个单位,如果他们支持它。如果没有,请重新启动它们。如果装置尚未运行,则会启动。

让我们使用nfs-server.service检查一下,只是尝试重新加载此服务

[root@onitroad ~]# systemctl reload nfs-server.service
 Job for nfs-server.service invalid.

我收到一个错误,这意味着此服务没有重新加载选项

[root@onitroad ~]# systemctl reload-or-restart nfs-server.service

此处我的服务已成功重新启动,因为此服务不支持重新加载标志

[root@onitroad ~]# systemctl status nfs-server.service
 ● nfs-server.service - NFS server and services
Dec 25 20:16:03 onitroad.lab systemd[1]: Starting NFS server and services...
 Dec 25 20:16:03 onitroad.lab systemd[1]: Started NFS server and services.

让我们尝试使用支持“重新加载”的服务(如sshd), 监控 “active since”部分

[root@onitroad ~]# systemctl status sshd.service
 
    Active: active (running) since Mon 2015-12-25 19:19:54 IST; 59min ago
      

再次尝试 "reload-or-restart"

[root@onitroad ~]# systemctl reload-or-restart sshd.service

现在,如果我检查“active since”这行,它是不变的,因此服务被正确地重新加载

[root@onitroad ~]# systemctl status sshd.service
    Active: active (running) since Mon 2015-12-25 19:19:54 IST; 1h 0min ago

同样也可以使用“reload-or-try-restart”,并且systemd还将在尝试重新启动之前检查服务当前是否正在运行

reload-or-try-restart 模式...
重新加载一个或者多个单位,如果他们支持它。如果没有,请重新启动它们。如果装置未运行,则此操作无效。注意,为了与SysV init脚本兼容,force reload相当于此命令。

10.查看服务单元文件的整个配置

使用“-show”标志查看单元文件的属性,如下所示。

[root@onitroad ~]# systemctl show nfs-server.service
 Type=oneshot
 Restart=no
 NotifyAccess=none
 RestartUSec=100ms
 TimeoutStartUSec=0
 TimeoutStopUSec=1min 30s
 WatchdogUSec=0
 WatchdogTimestampMonotonic=0
 StartLimitInterval=10000000
...
 MainPID=0
 ControlPID=0
 FileDescriptorStoreMax=0
 StatusErrno=0
 Result=success

5. 启用或者禁用服务

这里通过启用或者禁用服务,我们的意思是确保该服务在系统重新启动后可以启动,同样如果禁用该服务不应在启动时自动启动。

当我们启用一个服务时,它会创建一个从"/etc/systemd/system/<default_target>.wants/<unit_file.service>" 到 "/usr/lib/systemd/system/<unit_file.service>"的服务单位文件的符号链接

同样,当禁用时,它将从默认目标中删除符号链接。

在下面的示例中,因为我的默认目标是运行级别 3,例如:multi-user.target 因此在启用或者禁用服务时相同的将是可见的

语法(启用服务)

systemctl enable something.service

例如,启用“nfs server.service”

[root@onitroad ~]# systemctl enable nfs-server.service
 Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

注意:如果服务已经处于启用状态,您可能会得到一个空白输出

语法(要禁用一个服务:

systemctl disable something.service

例如,禁用“nfs server.service”

[root@onitroad ~]# systemctl disable nfs-server.service
 Removed symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service.

注意:如果服务已处于禁用状态,则可能会得到空白输出。

--no-reload
     当与enable和disable一起使用时,不要在执行更改后隐式重新加载守护程序配置。

当使用此选项“启用”或者“禁用”时,您可以使用“-no reload”来确保服务未重新加载,而只是启用或者禁用

9. 列出系统上所有可用的单位

要列出系统上安装的所有单元及其当前状态,执行以下内容:

[root@onitroad ~]# systemctl list-unit-files
 UNIT FILE                                     STATE
 proc-sys-fs-binfmt_misc.automount             static
 dev-hugepages.mount                           static
 dev-mqueue.mount                              static
 proc-fs-nfsd.mount                            static
 proc-sys-fs-binfmt_misc.mount                 static
 sys-fs-fuse-connections.mount                 static
 sys-kernel-config.mount                       static
 sys-kernel-debug.mount                        static
...

7. 列出服务的依赖项

很多时候,一个系统服务依赖于多个其他服务来正常运行

[root@onitroad ~]# systemctl list-dependencies nfs-server.service
 nfs-server.service
 ● ├─auth-rpcgss-module.service
 ● ├─nfs-config.service
 ● ├─nfs-idmapd.service
 ● ├─nfs-mountd.service
 ● ├─proc-fs-nfsd.mount
 ● ├─rpc-statd-notify.service
 ● ├─rpc-statd.service
 ● ├─rpcbind.socket
 ● ├─system.slice
 ● ├─network-online.target
 ● │ └─NetworkManager-wait-online.service
 ● └─network.target

您可以使用“-plain”将此列表显示为纯文本而不是树

[root@onitroad ~]# systemctl list-dependencies nfs-server.service --plain
 nfs-server.service
   auth-rpcgss-module.service
   nfs-config.service
   nfs-idmapd.service
   nfs-mountd.service
   proc-fs-nfsd.mount
   rpc-statd-notify.service
   rpc-statd.service
   rpcbind.socket
   system.slice
   network-online.target
   NetworkManager-wait-online.service
   network.target

主服务启动所需的任何依赖项服务都必须是“活动且正在运行”的,否则主服务将无法启动。

假设这里我停止了“nfs-server.service”所需的rpc-statd.service

[root@onitroad ~]# systemctl stop rpc-statd.service

检验一下:

[root@onitroad ~]# systemctl status rpc-statd.service
 ● rpc-statd.service - NFS status monitor for NFSv2/3 locking.
    Loaded: loaded (/usr/lib/systemd/system/rpc-statd.service; static; vendor preset: disabled)
    Active: inactive (dead) since Mon 2015-12-25 19:40:55 IST; 2s ago

现在,由于其中一个依赖服务已失效,让我们检查“nfs server.service”的状态,因此正如预期的那样,该服务已失效。

[root@onitroad ~]# systemctl status nfs-server
 ● nfs-server.service - NFS server and services
    Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
    Active: inactive (dead) since Mon 2015-12-25 19:26:28 IST; 14min ago
  

如果我尝试直接启动“nfs server.service”,它将尝试启动所有必需的依赖服务

[root@onitroad ~]# systemctl start nfs-server.service

这次启动服务花了一些时间,让我们检查一下状态

[root@onitroad ~]# systemctl status nfs-server.service
 ● nfs-server.service - NFS server and services
    Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
    Active: active (exited) since Mon 2015-12-25 19:41:49 IST; 10s ago
   

所以“nfs server.service”和我们之前停止的“rpc statd.service”都启动了

[root@onitroad ~]# systemctl status rpc-statd.service
 ● rpc-statd.service - NFS status monitor for NFSv2/3 locking.
    Loaded: loaded (/usr/lib/systemd/system/rpc-statd.service; static; vendor preset: disabled)
    Active: active (running) since Mon 2015-12-25 19:41:19 IST; 4min 17s ago
   Process: 1751 ExecStart=/usr/sbin/rpc.statd $STATDARGS (code=exited, status=0/SUCCESS)
  Main PID: 1752 (rpc.statd)
    CGroup: /system.slice/rpc-statd.service
            └─1752 /usr/sbin/rpc.statd

3.只有当服务处于运行状态时才重新启动服务

默认情况下,我们使用“restart”标志来重新启动服务,但在 RHEL 7 中,我们有一个新标志,例如:try-restart,这样 systemd 将检查服务的现有状态是否处于运行状态,然后只有它才会尝试重新启动服务,但如果服务的现有状态处于停止状态,那么 systemd 将跳过重新启动服务。

此功能在脚本编写和自动化方面很有帮助,我们在重新启动之前添加特定的检查服务是否正在运行

语法

systemctl try-restart something.service
或者
systemctl condrestart something.service

try-restart 模式...

如果单元正在运行,则重新启动命令行上指定的一个或者多个单元。 如果单元没有运行,这没有任何作用。 请注意,为了与 Red Hat init 脚本兼容,condrestart 等效于该命令。

日期:2020-06-02 22:17:18 来源:oir作者:oir