Red Hat Training

A Red Hat training course is available for RHEL 8

14.2. 使用 systemctl 管理系统服务

作为系统管理员,您可以使用 systemctl 工具管理系统服务。您可以执行各种任务,如启动、停止、重启运行的服务、启用和禁用服务以在引导时启动、列出可用的服务以及显示系统服务状态。

14.2.1. 列出系统服务

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

流程

使用 systemctl 命令执行以下任何一个任务:

  • 列出所有当前载入的服务单元:

    $ 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, or a 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
    配置文件的载入状态
    ACTIVESUB
    当前高级别和低级别单元文件激活状态
    DESCRIPTION
    单元目的和功能的简短描述
  • 使用以下带有 --all-a 命令行选项的命令,列出 所有载入的单元,而不考虑其状态

    $ systemctl list-units --type service --all
  • 列出所有可用服务单元的状态(enableddisabled):

    $ 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.2.2. 显示系统服务状态

您可以检查任何服务单元以获取详细信息,并验证该服务的状态,无论是否启用了以便在引导期间启动还是当前正在运行。您还可以查看在特定的服务单元之后或之前启动的服务。

流程

使用 systemctl 命令执行以下任何一个任务:

  • 显示与系统服务对应的服务单元的详细信息:

    $ systemctl status <name>.service

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

    这个命令显示以下信息:

    • 所选服务单元的名称,后跟一个简短描述
    • 可用服务单元信息中 描述的一个或多个字段
    • 服务单元的执行:如果单元由 root 用户执行
    • 最新的日志条目

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

      描述

      Loaded

      是否服务单元已载入的信息、到单元文件的绝对路径,以及是否已启用该单元以便在引导时启动。

      Active

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

      Main PID

      进程 ID 和相应的系统服务的名称。

      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
               └─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

  • 检查在指定的服务单元之前,systemd 命令哪些服务启动

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

    例如,要查看在 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]
  • 检查在指定的服务单元之后,systemd 命令哪些服务启动:

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

    例如,要查看在 gdmsystemd 要启动的服务的列表,请输入:

    # 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.2.3. 启动一个系统服务

您可以使用 start 命令在当前会话中启动系统服务。

先决条件

  • 根访问权限

流程

  • 在当前会话中启动一个系统服务:

    # systemctl start <name>.service

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

    注意

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

    当您试图启动新服务时,systemd 会自动解析所有依赖项,而不会向用户明确通知。这意味着,如果您已运行了一个服务,并且您尝试使用负依赖项启动另一个服务,则第一个服务会自动停止。

    例如,如果您正在运行 postfix 服务,并且您试图启动 sendmail 服务,systemd 首先自动停止 postfix,因为这两个服务会冲突且无法在同一端口上运行。

14.2.4. 停止一个系统服务

如果要在当前会话中停止系统服务,请使用 stop 命令。

先决条件

  • 根访问权限

流程

  • 停止一个系统服务:

    # systemctl stop <name>.service

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

14.2.5. 重启一个系统服务

您可以使用 restart 命令在当前会话中重启系统服务,以执行以下操作:

  • 在当前会话中停止所选的服务单元,并立即再次启动它。
  • 仅在对应的服务已在运行时才重启服务单元。
  • 重新加载系统服务的配置,而不中断其执行。

先决条件

  • 根访问权限

流程

  • 重启一个系统服务:

    # systemctl restart <name>.service

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

    注意

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

  • 可选:只有在相应的服务已在运行时才重启服务单元:

    # systemctl try-restart <name>.service
  • 可选:重新载入配置,而不中断服务执行:

    # systemctl reload <name>.service
    注意

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

其他资源

14.2.6. 启用一个系统服务,以便在引导时启动

您可以启用一个服务以便在引导时自动启动,这些更改将在下次重启时应用。

先决条件

  • 根访问权限
  • 您需要启用的服务不能被屏蔽。如果您有一个屏蔽的服务,请首先取消屏蔽:

    # systemctl unmask <name>.service

流程

  • 在引导时启用服务:

    # systemctl enable <name>.service

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

  • 可选:您也可以使用单个命令启用并启动一个服务:

    # systemctl enable --now <name>.service

其他资源

14.2.7. 禁用一个系统服务在引导时启动

您可以防止服务单元在引导时自动启动。如果您禁用某个服务,它不会在引导时启动,但可以手动启动。您还可以屏蔽服务,使其无法手动启动。屏蔽是一种禁用服务的方法,使该服务能够永久不可用,直到再次屏蔽该服务。

先决条件

  • 根访问权限

流程

  • 禁用要在引导时启动的服务:

    # systemctl disable <name>.service

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

  • 可选:如果要使服务永久不可用,请屏蔽该服务:

    # systemctl mask <name>.service

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

其他资源