现在在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
您还有两个标志可用于检查服务是否处于活动状态
is-active PATTERN...
检查是否有任何指定的单元处于活动状态(即正在运行)。 如果至少有一个是活动的,则返回退出代码 0,否则返回非零。 除非指定 --quiet ,否则这也会将当前单元状态打印到标准输出。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 等效于该命令。