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
- 配置文件的载入状态
ACTIVE
或SUB
- 当前高级别和低级别单元文件激活状态
DESCRIPTION
- 单元目的和功能的简短描述
使用以下带有
--all
或-a
命令行选项的命令,列出 所有载入的单元,而不考虑其状态:$ systemctl list-units --type service --all
列出所有可用服务单元的状态(enabled 或 disabled):
$ 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-active
和systemctl 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
例如,要查看在
gdm
后systemd
要启动的服务的列表,请输入:# 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
,因为这两个服务会冲突且无法在同一端口上运行。
其他资源
-
系统中的
systemctl (1)
手册页 - 启用一个系统服务,以便在引导时启动
- 显示系统服务状态
14.2.4. 停止一个系统服务
如果要在当前会话中停止系统服务,请使用 stop
命令。
先决条件
- 根访问权限
流程
停止一个系统服务:
# systemctl stop <name>.service
将
<name>
替换为您要停止的服务单元的名称(例如:bluetooth
)。
其他资源
-
系统中的
systemctl (1)
手册页 - 禁用一个系统服务在引导时启动
- 显示系统服务状态
14.2.5. 重启一个系统服务
您可以使用 restart
命令在当前会话中重启系统服务,以执行以下操作:
- 在当前会话中停止所选的服务单元,并立即再次启动它。
- 仅在对应的服务已在运行时才重启服务单元。
- 重新加载系统服务的配置,而不中断其执行。
先决条件
- 根访问权限
流程
重启一个系统服务:
# systemctl restart <name>.service
使用您要重启的服务单元的名称替换
<name>
(例如httpd
)。注意如果所选服务单元没有运行,这个命令也会启动它。
可选:只有在相应的服务已在运行时才重启服务单元:
# systemctl try-restart <name>.service
可选:重新载入配置,而不中断服务执行:
# systemctl reload <name>.service
注意不支持此功能的系统服务忽略此命令。要重启这些服务,请使用
reload-or-restart
和reload-or-try-restart
命令。
其他资源
-
您系统上的
systemctl
手册页 - 显示系统服务状态
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
无法访问实际的单元文件。