Red Hat Training

A Red Hat training course is available for RHEL 8

第 14 章 使用 systemctl 管理系统服务

systemctl 工具有助于管理系统服务。您可以使用 systemctl 实用程序执行与不同服务相关的不同任务,如启动、停止、重启、启用和禁用服务、列出服务以及显示系统服务状态。

这部分论述了如何使用 systemctl 工具管理系统服务。

14.1. 使用 systemctl 的服务单元管理

服务单元 可帮助控制系统中的服务和守护进程状态。

服务单元以 .service 文件扩展名结尾,例如 nfs-server.service。但是,在命令中使用服务文件名时,您可以省略文件扩展名。systemctl 工具假设参数是一个服务单元。例如,要停止 nfs-server.service,请输入以下命令:

# systemctl stop nfs-server

另外,有些服务单元都有 别名。别名可能小于单位,您可以使用它们而不是实际的单元名称。

要查找可用于特定单元的所有别名,请使用:

# systemctl show nfs-server.service -p Names

14.2. service 工具程序和 systemctl 的比较

本节显示了服务工具与 systemctl 命令使用的比较。

表 14.1. service 工具程序和 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

显示所有服务的状态。

14.3. 列出系统服务

您可以列出所有当前载入的服务单元以及所有可用服务单元的状态。

流程

  • 要列出所有当前载入的服务单元,请输入:

    $ 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
    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-units 命令只显示活跃的单元。对于每个服务单元文件,命令会显示:

    • UNIT: 其全名
    • LOAD: 是否载入该单元文件的信息
    • ACTIVE\ SUB:其高级别和低级单元文件激活状态
    • DESCRIPTION: 简短描述
  • 要列出 所有载入的单元,无论它们的状态 如何,请使用 --all-a 命令行选项输入以下命令:

    $ systemctl list-units --type service --all
  • 要列出所有可用服务单元的状态(启用/禁用),请输入:

    $ systemctl list-unit-files --type service
    UNIT FILE                               STATE
    abrt-ccpp.service                       enabled
    abrt-oops.service                       enabled
    abrtd.service                           enabled
    ...
    wpa_supplicant.service                  disabled
    ypbind.service                          disabled
    
    208 unit files listed.

    对于每个服务单元,这个命令会显示:

    • UNIT FILE: 其全名
    • STATE: 服务单元是否启用或禁用

14.4. 显示系统服务状态

您可以检查任何服务单元来获取其详细信息,并验证服务的状态,无论它是否已启用还是正在运行。您还可以查看在特定服务单元之后或之前排序启动的服务。

流程

  • 要显示与系统服务对应的服务单元的详细信息,请输入:

    $ systemctl status <name>.service

    <name> 替换为您要检查的服务单元的名称(例如 gdm)。

    这个命令显示所选服务单元的名称,后接其简短描述、Available 服务单元信息 中描述的一个或多个字段(如果由 root 用户执行),以及最新的日志条目。

    表 14.2. 可用的服务单元信息

    描述

    Loaded

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

    Active

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

    Main PID

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

    Status

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

    Process

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

    CGroup

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

    例 14.1. 显示服务状态

    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.
  • 要只验证某个服务单元是否正在运行,请输入:

    $ systemctl is-active <name>.service
  • 要确定某个服务单元是否启用,请输入:

    $ systemctl is-enabled <name>.service
    注意

    如果指定的服务单元正在运行或启用, systemctl is-activesystemctl is-enabled 都会返回一个 0 退出状态。

  • 要确定在指定服务单元前调度什么服务启动,请输入:

    # systemctl list-dependencies --after <name>.service

    <name> 替换为命令中的服务名称。例如:要查看在 gdm 之前排序启动的服务列表,请输入:

    # 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]
  • 要确定在指定服务单元后调度的服务启动,请输入:

    # systemctl list-dependencies --before <name>.service

    <name> 替换为命令中的服务名称。例如:要查看在 gdm 后排序启动的服务列表,请输入:

    # 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

其它资源

14.5. 服务依赖项和负性

systemd 中,服务间存在正或负的依赖关系。启动特定服务可能需要启动一个或多个其他服务(正依赖项)或者停止一个或多个服务(负依赖项)。

当您试图启动新服务时, systemd 会自动解析所有依赖项,而无需向用户发出显式通知。这意味着,如果您已在运行服务,且您试图使用负依赖项启动另一个服务,则第一个服务会自动停止。

例如:如果您正在运行 postfix 服务,且您试图启动 sendmail 服务, systemd 首先会自动停止 postfix,因为这两个服务是冲突的,且不能在同一端口中运行。

其它资源

14.6. 启动系统服务

您可以使用 start 命令在当前会话中启动系统服务。您必须具有 root 访问权限,因为启动服务可能会影响操作系统的状态。

流程

  • 要启动与系统服务对应的所选服务单元,以 root 身份输入以下命令:

    # systemctl start <name>.service

    <name> 替换为您要启动的服务单元的名称(例如 httpd.service)。

    例 14.2. 启动 httpd.service

    Apache HTTP 服务器的服务单元名为 httpd.service。要激活这个服务单元并在当前会话中启动 httpd 守护进程,以 root 身份输入以下命令:

    # systemctl start httpd.service

14.7. 停止系统服务

您可以使用 stop 命令停止当前会话中的系统服务。您必须具有 root 访问权限,因为停止服务可能会影响操作系统的状态。

流程

  • 要停止与系统服务对应的服务单元,以 root 身份输入以下命令:

    # systemctl stop <name>.service

    <name> 替换为您要停止的服务单元的名称(例如 bluetooth)。

    例 14.3. 停止 bluetoothd.service

    bluetoothd 守护进程的服务单元命名为 bluetooth.service。要取消激活这个服务单元并在当前会话中停止 bluetoothd 守护进程,以 root 身份输入以下命令:

    # systemctl stop bluetooth.service

14.8. 重启系统服务

您可以使用 restart 命令重启当前会话中的系统服务。您必须具有 root 访问权限,因为重启服务可能会影响操作系统的状态。

这个步骤描述了如何:

  • 停止当前会话中所选服务单元并立即再次启动
  • 仅在相应服务已在运行时重启服务单元
  • 在不中断其执行的情况下重新载入系统服务的配置

流程

  • 要重启与系统服务对应的服务单元,以 root 身份输入以下命令:

    # systemctl restart <name>.service

    <name> 替换为您要重启的服务单元的名称(例如 httpd)。

    注意

    如果所选服务单元没有运行,这个命令也会启动它。

    • 另外,若要在相应服务已在运行时重启服务单元,以 root 身份输入以下命令:

      # systemctl try-restart <name>.service
    • 要在不中断服务的情况下重新载入配置,以 root 身份输入以下命令:

      # systemctl reload <name>.service
      注意

      不支持这个功能的系统服务会忽略这个命令。要重启这些服务,使用 reload-or-restartreload-or-try-restart 命令。

    例 14.4. 重新载入 httpd.service

    为了防止用户遇到不必要的错误信息或部分呈现网页,Apache HTTP 服务器允许您编辑并重新载入其配置,而无需重启它并中断主动处理的请求。要做到这一点,以 root 身份输入以下内容:

    # systemctl reload httpd.service

14.9. 启用系统服务

您可以将服务配置为在系统引导时自动启动。enable 命令读取所选服务单元的 [Install] 部分,并创建到 /etc/systemd/system/ 目录中的 /usr/lib/systemd/system/name.service 文件及其子目录中的正确符号链接。然而,它不会重写已经存在的链接。

流程

  • 要配置与系统服务对应的服务单元,在引导时自动启动,以 root 身份输入以下命令:

    # systemctl enable <name>.service

    <name> 替换为您要启用的服务单元的名称(例如 httpd)。

    • 如果要确保重新创建符号链接,以 root 身份输入以下命令:

      # systemctl reenable <name>.service

      该命令禁用所选服务单元,并立即再次启用。

      例 14.5. 启用 httpd.service

      要将 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.

14.10. 禁用系统服务

您可以防止服务单元在引导时自动启动。disable 命令读取所选服务单元的 [Install] 部分,并从 /etc/systemd/system/ 目录中删除到 /usr/lib/systemd/system/name.service 文件的适当符号链接。

流程

  • 要配置与系统服务对应的服务单元,在引导时不自动启动,以 root 身份输入以下命令:

    # systemctl disable <name>.service

    <name> 替换为您要禁用的服务单元的名称(例如 bluetooth)。

    例 14.6. 禁用 bluetoothd.service

    bluetoothd 守护进程的服务单元命名为 bluetooth.service。要防止这个服务单元在引导时启动,以 root 身份输入以下命令:

    # systemctl disable bluetooth.service
    Removed symlink /etc/systemd/system/bluetooth.target.wants/bluetooth.service.
    Removed symlink /etc/systemd/system/dbus-org.bluez.service.
    • 要屏蔽任何服务单元并防止手动启动或者由其他服务启动,以 root 身份输入以下命令:

      # systemctl mask <name>.service

      这个命令将 /etc/systemd/system/name.service 文件替换为到 /dev/null 的符号链接,从而使 systemd 无法访问实际单元文件。

    • 要恢复这个动作并取消掩码一个服务单元,请输入:

      # systemctl unmask <name>.service