10.2. 管理系统服务
为了扩展您的专业知识,您可能还对红帽系统管理二(RH134) 培训课程感兴趣。
之前的 Red Hat Enterprise Linux 版本使用 SysV init 或 Upstart 分发,使用位于 /etc/rc.d/init.d/
目录的 init 脚本。这些初始化脚本通常使用 Bash 编写,并允许系统管理员控制其系统中的服务和守护进程状态。在 Red Hat Enterprise Linux 7 中,这些初始化脚本已被服务单元替代。
服务单元带有 .service
文件扩展名,其用途与初始化脚本类似。要查看、启动、停止、重启、启用或禁用系统服务,请使用 systemctl
命令,如 表 10.3 “服务实用程序与 systemctl 的比较”、表 10.4 “chkconfig 实用程序与 systemctl 的比较” 及其他部分所述。在系统中仍可使用 service
和 chkconfig
命令,并可按预期工作。这只用于兼容性,应该尽量不使用。
service | systemctl | 描述 |
---|---|---|
|
| 启动一个服务。 |
|
| 停止服务。 |
|
| 重启服务。 |
|
| 仅在运行时重启服务。 |
|
| 重新加载配置。 |
|
| 检查服务是否在运行。 |
|
| 显示所有服务的状态。 |
chkconfig | systemctl | 描述 |
---|---|---|
|
| 启用服务。 |
|
| 禁用服务。 |
|
| 检查是否启用了服务。 |
|
| 列出所有服务并检查是否启用它们。 |
|
| 列出在指定单元前排序启动的服务。 |
|
| 列出在指定单元之后排序启动的服务。 |
指定服务单元
为清楚起见,本节其余部分中的所有命令示例都使用带有 .service
文件扩展名的完整单元名称,例如:
~]# systemctl stop nfs-server.service
但是,可以省略文件扩展名,在这种情况下,system
ctl 实用程序假定参数是服务单元。以下命令等同于以上命令:
~]# systemctl stop nfs-server
此外,某些单元具有别名名称。这些名称的名称比单元短,可以使用它们,而不是实际的单元名称。要查找可用于特定单元的所有别名,请使用:
~]# systemctl show nfs-server.service -p Names
systemctl 在 chroot 环境中的行为
如果您使用 chroot
命令更改根目录,大多数 systemctl
命令会拒绝执行任何操作。原因在于 systemd
进程和使用 chroot 命令的用户对
文件系统没有相同的视图。当从 kickstart
文件中调用 systemctl
时会出现这种情况。
一个例外是单元文件命令,如 systemctl enable
和 systemctl disable
命令。这些命令不需要运行中的系统,也不会影响正在运行的进程,但它们确实会影响单元文件。因此,即使在 chroot
环境中也可以运行这些命令。例如:要在 /srv/website1/
目录下的系统中启用 httpd
服务:
~]# chroot /srv/website1 ~]# systemctl enable httpd.service Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service, pointing to /usr/lib/systemd/system/httpd.service.
10.2.1. 列出服务
要列出所有目前载入的服务单元,在 shell 提示下键入以下内容:
systemctl list-units --type service
对于每个服务单元文件,此命令会显示其全名(UNIT
),后跟一个备注,该单元文件是否已加载(LOAD
)、其高级(ACTIVE)
和低级(SU
B)单元文件激活状态,以及简短描述(DESCRIPTION
)。
默认情况下,systemctl list-units
命令只显示活跃的单位。如果您想列出所有载入的单元,无论它们的状态如何,请使用 --all
或 -a
选项。
systemctl list-units --type service --all
您还可以列出所有可用服务单元以查看是否启用了它们。要做到这一点,请键入:
systemctl list-unit-files --type service
对于每个服务单元,此命令会显示其全名(UNIT FILE
),后跟服务单元是否已启用(STATE)的信息。
有关如何确定独立服务单元状态的详情请参考 第 10.2.2 节 “显示服务状态”。
例 10.1. 列出服务
要列出所有目前载入的服务单元,请运行以下命令:
~]$ systemctl list-units --type service
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-ccpp.service loaded active exited Install ABRT coredump hook
abrt-oops.service loaded active running ABRT kernel log watcher
abrt-vmcore.service loaded active exited Harvest vmcores for ABRT
abrt-xorg.service loaded active running ABRT Xorg log watcher
abrtd.service loaded active running ABRT Automated Bug Reporting Tool
...
systemd-vconsole-setup.service loaded active exited Setup Virtual Console
tog-pegasus.service loaded active running OpenPegasus CIM Server
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
46 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'
要列出所有安装的服务单元文件以确定它们是否启用,请输入:
~]$ systemctl list-unit-files --type service UNIT FILE STATE abrt-ccpp.service enabled abrt-oops.service enabled abrt-vmcore.service enabled abrt-xorg.service enabled abrtd.service enabled ... wpa_supplicant.service disabled ypbind.service disabled 208 unit files listed.
10.2.2. 显示服务状态
要显示与系统服务对应的服务单元的详细信息,请在 shell 提示符后输入以下内容:
systemctl status name.service
使用您要检查的服务单元的名称替换 name(例如: gdm
)。这个命令显示所选服务单元的名称,后跟其简短描述、表 10.5 “可用服务单元信息” 中描述的一个或多个字段,如果由 root
用户执行,也是最新的日志条目。
项 | 描述 |
---|---|
| 是否载入了服务单元、到这个单元文件的绝对路径,以及是否启用该单位的信息。 |
| 服务单元是否在运行的信息,后面有一个时间戳。 |
| 对应系统服务的 PID 及其名称。 |
| 相关系统服务的额外信息。 |
| 有关相关进程的附加信息。 |
| 有关相关控制组群(cgroups)的附加信息。 |
要只验证某个服务单元是否正在运行,运行以下命令:
systemctl is-active name.service
要确定某个服务单元是否启用,运行:
systemctl is-enabled name.service
请注意,如果指定的服务单元正在运行或已启用,则 systemctl is-active
和 systemctl is-enabled
的返回退出状态为 0
。有关如何列出所有当前载入的服务单元的详情请参考 第 10.2.1 节 “列出服务”。
例 10.2. 显示服务状态
GNOME 显示管理器的服务单元名为 gdm.service
。要确定这个服务单元的当前状态,在 shell 提示下键入以下内容:
~]# systemctl status gdm.service gdm.service - GNOME Display Manager Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled) Active: active (running) since Thu 2013-10-17 17:31:23 CEST; 5min ago Main PID: 1029 (gdm) CGroup: /system.slice/gdm.service ├─1029 /usr/sbin/gdm ├─1037 /usr/libexec/gdm-simple-slave --display-id /org/gno... └─1047 /usr/bin/Xorg :0 -background none -verbose -auth /r... Oct 17 17:31:23 localhost systemd[1]: Started GNOME Display Manager.
例 10.3. 在服务前按顺序显示服务
要确定在指定服务前调度什么服务启动,在 shell 提示下键入以下内容:
~]# systemctl list-dependencies --after gdm.service gdm.service ├─dbus.socket ├─getty@tty1.service ├─livesys.service ├─plymouth-quit.service ├─system.slice ├─systemd-journald.socket ├─systemd-user-sessions.service └─basic.target [output truncated]
例 10.4. 在服务后显示被启动的服务
要确定在指定服务后调度的服务启动,在 shell 提示符后输入以下内容:
~]# systemctl list-dependencies --before gdm.service gdm.service ├─dracut-shutdown.service ├─graphical.target │ ├─systemd-readahead-done.service │ ├─systemd-readahead-done.timer │ └─systemd-update-utmp-runlevel.service └─shutdown.target ├─systemd-reboot.service └─final.target └─systemd-reboot.service
10.2.3. 启动服务
要启动与系统服务对应的服务单元,以 root
用户身份在 shell 提示符后输入以下内容:
systemctl start name.service
使用您要启动的服务单元的名称替换 name(例如: gdm
)。这个命令会在当前会话中启动所选服务单元。有关如何在引导时启用服务单元的详情请参考 第 10.2.6 节 “启用服务”。有关如何确定特定服务单元状态的详情请参考 第 10.2.2 节 “显示服务状态”。
例 10.5. 启动服务
Apache HTTP 服务器的服务单元名为 httpd.service
。要激活这个服务单元并在当前会话中启动 httpd
守护进程,以 root
用户身份运行以下命令:
~]# systemctl start httpd.service
10.2.4. 停止服务
要停止与系统服务对应的服务单元,以 root
用户身份在 shell 提示符后输入以下内容:
systemctl stop name.service
使用您要停止的服务单元的名称替换 name(例如: bluetooth
)。该命令将在当前会话中停止所选服务单元。有关如何禁用服务单元并阻止它在引导时启动的详情请参考 第 10.2.7 节 “禁用服务”。有关如何确定特定服务单元状态的详情请参考 第 10.2.2 节 “显示服务状态”。
例 10.6. 停止服务
bluetoothd
守护进程的服务单元名为 bluetooth.service
。要取消激活这个服务单元并在当前会话中停止 bluetoothd
守护进程,以 root
用户身份运行以下命令:
~]# systemctl stop bluetooth.service
10.2.5. 重启服务
要重启与系统服务对应的服务单元,以 root
用户身份在 shell 提示符后输入以下内容:
systemctl restart name.service
使用您要重启的服务单元的名称替换 name(例如 httpd
)。这个命令可在当前会话中停止所选服务单元,并立即重新启动。最重要的是,如果所选服务单元没有运行,这个命令也会启动它。要让 systemd 仅在相应服务已在运行时重启服务单元,以 root
用户身份运行以下命令:
systemctl try-restart name.service
某些系统服务还允许您在不中断其执行的情况下重新载入其配置。要做到这一点,以 root
用户身份输入:
systemctl reload name.service
请注意,不支持这个功能的系统服务会忽略这个命令。为方便起见,systemctl
命令还支持 reload-or-restart
和 reload-or-try-restart
命令来替代重启这些服务。有关如何确定特定服务单元状态的详情请参考 第 10.2.2 节 “显示服务状态”。
例 10.7. 重启服务
为了防止用户遇到不必要的错误消息或部分呈现的 Web 页面,Apache HTTP 服务器允许您编辑和重新加载其配置,而无需重新启动它并中断主动处理的请求。要做到这一点,以 root
根用户身份在 shell 提示符后输入以下内容:
~]# systemctl reload httpd.service
10.2.6. 启用服务
要配置与系统服务对应的服务单元,在引导时自动启动,以 root
用户身份在 shell 提示符后输入以下内容:
systemctl enable name.service
使用您要启用的服务单元的名称替换 name(例如 httpd
)。该命令读取所选服务单元的 [Install]
部分,并在 /etc/systemd/system/
目录和其子目录中创建到 /usr/lib/systemd/system/name.service
的符号链接。但是,这个命令不会重写已经存在的链接。如果要确保重新创建符号链接,以 root
用户身份使用以下命令:
systemctl reenable name.service
该命令禁用所选服务单元,并立即再次启用。有关如何确定某个服务单元是否已启用在引导时启动的详情请参考 第 10.2.2 节 “显示服务状态”。有关如何在当前会话中启动服务的详情请参考 第 10.2.3 节 “启动服务”。
例 10.8. 启用服务
要将 Apache HTTP 服务器配置为在引导时自动启动,以 root
用户身份运行以下命令:
~]# systemctl enable httpd.service Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
10.2.7. 禁用服务
要防止与系统服务对应的服务单元在引导时自动启动,以 root
用户身份在 shell 提示符后输入以下内容:
systemctl disable name.service
使用您要禁用的服务单元的名称替换 name(例如: bluetooth
)。该命令读取所选服务单元的 [Install]
部分,并从 /etc/systemd/system/
目录及其子目录中删除到 /usr/lib/systemd/system/name.service
文件的符号链接。另外,您可以屏蔽所有服务单元,以防止手动启动或者由其他服务启动。要做到这一点,以 root
运行以下命令:
systemctl mask name.service
这个命令将 /etc/systemd/system/name.service
文件替换为 /dev/null
的符号链接,从而导致 systemd 无法访问实际的单元文件。要恢复这个动作并取消掩码一个服务单元,以 root
用户身份输入:
systemctl unmask name.service
有关如何确定某个服务单元是否已启用在引导时启动的详情请参考 第 10.2.2 节 “显示服务状态”。有关如何在当前会话中停止服务的详情请参考 第 10.2.4 节 “停止服务”。
例 10.9. 禁用服务
例 10.6 “停止服务” 演示如何在当前会话中停止 bluetooth.service
单元。要防止这个服务单元在引导时启动,以 root
用户身份在 shell 提示符后输入以下内容:
~]# systemctl disable bluetooth.service Removed symlink /etc/systemd/system/bluetooth.target.wants/bluetooth.service. Removed symlink /etc/systemd/system/dbus-org.bluez.service.
10.2.8. 启动冲突服务
在 Systemd 中,不同服务间会存在正或负的依赖关系。启动特定的服务可能需要启动一个或多个其他服务(正向依赖项)或者停止一个或多个服务(负依赖项)。
当您试图启动新服务时,systemd 会自动解析所有依赖项。请注意,这是在没有向用户发出显式通知的情况下完成的。如果您已经运行了服务,且您试图使用负依赖项启动另一个服务,则第一个服务会自动停止。
例如,如果您运行 postfix
服务,并且尝试启动 sendmail
服务,systemd 首先会自动停止 postfix
,因为这两个服务彼此冲突且无法在同一个端口上运行。