Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

10.2. 管理系统服务

之前的 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 的比较” 及其他部分所述。在系统中仍可使用 servicechkconfig 命令,并可按预期工作。这只用于兼容性,应该尽量不使用。

表 10.3. 服务实用程序与 systemctl 的比较

servicesystemctl描述

service name start

systemctl start name.service

启动一个服务。

service name stop

systemctl stop name.service

停止服务。

service name restart

systemctl restart name.service

重启服务。

service name condrestart

systemctl try-restart name.service

仅在运行时重启服务。

service name reload

systemctl reload name.service

重新加载配置。

service name status

systemctl status name.service

systemctl is-active name.service

检查服务是否在运行。

service --status-all

systemctl list-units --type service --all

显示所有服务的状态。

表 10.4. chkconfig 实用程序与 systemctl 的比较

chkconfigsystemctl描述

chkconfig name on

systemctl enable name.service

启用服务。

chkconfig name off

systemctl disable name.service

禁用服务。

chkconfig --list name

systemctl status name.service

systemctl is-enabled name.service

检查是否启用了服务。

chkconfig --list

systemctl list-unit-files --type service

列出所有服务并检查是否启用它们。

chkconfig --list

systemctl list-dependencies --after

列出在指定单元前排序启动的服务。

chkconfig --list

systemctl list-dependencies --before

列出在指定单元之后排序启动的服务。

指定服务单元

为清楚起见,本节其余部分中的所有命令示例都使用带有 .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 enablesystemctl 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)和低级(SUB)单元文件激活状态,以及简短描述(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 用户执行,也是最新的日志条目。

表 10.5. 可用服务单元信息

描述

Loaded

是否载入了服务单元、到这个单元文件的绝对路径,以及是否启用该单位的信息。

Active

服务单元是否在运行的信息,后面有一个时间戳。

Main PID

对应系统服务的 PID 及其名称。

Status

相关系统服务的额外信息。

Process

有关相关进程的附加信息。

CGroup

有关相关控制组群(cgroups)的附加信息。

要只验证某个服务单元是否正在运行,运行以下命令:

systemctl is-active name.service

要确定某个服务单元是否启用,运行:

systemctl is-enabled name.service

请注意,如果指定的服务单元正在运行或已启用,则 systemctl is-activesystemctl 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-restartreload-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,因为这两个服务彼此冲突且无法在同一个端口上运行。