什么是 Systemctl?
systemctl 命令是一个实用程序,负责检查和控制 systemd 系统和服务管理器。 它是系统管理库、实用程序和守护程序的集合,作为 System V init 守护程序的后继程序。 事实证明,新的 systemctl 命令在管理服务器服务方面非常有用。 它提供了有关特定 systemd 服务的详细信息,以及具有服务器范围利用率的其他服务。
请记住,如果成功,大多数 systemctl 命令都不会提供任何输出。 但是,如果 systemctl 命令未能完成任务,您将收到一条错误消息,指出它失败。
归功于: linux.com
管理服务
什么是服务?
在里面 系统 实用程序,服务被称为 单元。 单元是系统知道如何操作和管理的任何资源。 单位是主要对象 系统 工具知道如何处理。 这些资产在称为单元文件的配置文件中定义。
检查服务状态
使用 systemctl,我们可以检查托管专用服务器上任何 systemd 服务的状态。 status 命令提供有关服务的信息。 它还列出了运行状态,或有关其未运行原因的详细信息,或者服务是否已意外停止。 如果我们以非 root 用户身份连接到服务器,则必须使用运行 systemctl 命令。
systemctl status servicename.service
该单元可以在没有 .service 扩展名的情况下调用。 由于 systemctl 会查找那些带有 .service 后缀的文件,因此该命令也可以这样使用。
systemctl start servicename
状态输出示例:
[root@host ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2020-05-08 14:15:54 EDT; 1 weeks 2 days ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 3767 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
Main PID: 1321 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─1321 /usr/sbin/httpd -DFOREGROUND
├─3769 /usr/sbin/httpd -DFOREGROUND
启动或停止服务
systemctl 实用程序还可用于使用服务单元文件启动或停止 systemd 服务,无论是否带有 .service 后缀。
systemctl start servicename.service
当我们想要停止特定服务时,同样的规则也适用。
systemctl stop servicename.service
请记住,启动命令只能用于当前未运行的 systemd 服务,而停止命令只能用于正在运行的服务。
重新启动或重新加载服务
可以使用 restart 命令重新启动正在运行的服务,以避免使用以下命令手动停止和启动它。
systemctl restart servicename.service
有时,我们不需要重新启动服务来应用配置更改(如果您进行了任何更改)。 相反,我们可以使用 reload 命令重新启动服务,该服务实现对正在运行的服务的任何更改。
systemctl reload servicename.serivce
如果我们不确定我们应该使用这两个命令中的哪一个,还有一个使用 reload-or-restart 命令的附加选项,它将自动为我们确定它。
systemctl reload-or-restart servicename.service
启用或禁用服务
对于云服务器服务,我们要求它们中的大多数始终在线且处于活动状态。 由于在服务器上运行所需的服务数量,手动启动它们并不是一种方便的方法。 这是启用和禁用命令发挥作用的地方。 使用 enable 命令,我们可以修改 systemd 服务在服务器启动或重启后的响应方式。 它将更新服务设置,然后告诉 systemd 特定服务需要在服务器启动后自动启动。 完成此操作的命令如下。
systemctl enable servicename.service
虽然 HTTPD、MySQL、MariaDB 等大多数服务已经自动启动,但我们可能需要手动为其中的一些启用自动启动。 类似于我们如何将服务设置为在服务器启动时自动启动,我们也可以使用以下命令禁用服务。
systemctl reload-or-restart servicename.service
disable 命令可防止在启动时自动启动服务,使其在手动启动之前处于非活动状态。
系统状态概述
我们介绍的所有 systemctl 命令主要用于管理单个服务。 让我们回顾一下 systemctl 必须提供的其他一些命令及其用途。

归功于: 新的控制组接口 自由桌面.org。 2015 年 8 月 28 日。2016 年 2 月 6 日检索。
什么是单元文件?
单元文件是一个平面文本文件,包含有关服务、套接字、设备、挂载点、交换文件、分区、启动目标、资产管理切片或一组外部创建的进程的信息。
使用单元文件
列出单位
list-units 命令显示服务器上所有活动的 systemd 服务。 我们的输出类似于 systemctl status 命令提供的信息,但没有那么详细。
systemctl list-units
这里是 example 该命令的输出。
root@host [~]# systemctl list-units
UNIT LOAD ACTIVE SUB DESCRIPTION
crond.service loaded active running Command Scheduler
dovecot.service loaded active running Dovecot IMAP/POP3 email server
firewalld.service loaded active running firewalld - dynamic firewall daemon
httpd.service loaded active running The Apache HTTP Server
mariadb.service loaded active running MariaDB database server
named.service loaded active running Berkeley Internet Name Domain (DNS)
现在我们有一个 example 输出的内容,让我们回顾一下每一列的含义。
- UNIT:systemd 单元的名称。
- LOAD:这表明该单元的配置是否正在由 systemd 加载。 如果是,则配置存储在服务器的内存中。
- ACTIVE:这表明设备的状态并显示它是否处于活动状态。
- SUB:这提供了有关单元的更详细信息,这些信息将根据单元的类型、状态和单元运行的方法而有所不同。
- 描述:这个简短的描述包含每个单元是什么以及它的作用。
单位国家
使用 systemctl list-units 命令将显示所有处于“加载”和“活动”状态的单元 加载 和 积极的 列; 但是,如果我们希望获得所有服务的更详细列表,我们需要使用命令标志。 在这种情况下, –all 标志。
systemctl list-units --all
使用 -all 标志,我们可以获得已加载或 systemd 尝试加载的所有 systemd 单元的列表。 此输出还将显示当前处于非活动、死亡、失败状态或尚未在服务器磁盘上找到的服务。
虽然这个标志提供了服务器上所有单元的完整输出,这些单元被 systemd 加载到内存中,但我们可以使用额外的标志来进一步过滤列表单元的输出。 其中之一是 –state= 标志。 我们可以使用这个标志来进一步过滤 LOAD、ACTIVE 和 SUB 列中的状态。
systemctl list-units --all --state=failed
正如我们可以按状态过滤单元一样,我们也可以使用相同的类型来完成相同的任务。
systemctl list-units --all --type=mount
list-units 命令显示 systemd 已加载或尝试加载到内存中的单元。 但是,不在 systemd 内存中的单元呢? 这是 list-unit-files 标志发挥作用的地方,因为此命令将显示服务器上的所有可用单元。
systemctl list-unit-files
输出将在两列中给出,文件名和状态。
UNIT FILE STATE
Proc-sys-fs-binfmt_misc.automount static
dev-hugepages.mount static
dev-mqueue.mount static
proc-sys-fs-binfmt_misc.mount static
sys-fs-fuse-connections.mount static
sys-kernel-config.mount static
sys-kernel-debug.mount static
tmp.mount disabled
这 状态 列有四种不同的状态,它们是:
- 启用
- 已禁用
- 静止的
- 蒙面
蒙面单位
正如您在上面的输出中看到的那样,许多单位显示静态状态 地位。 这表明这些单元在单元的配置文件中没有“安装”部分,因此无法启用。 另一方面,某些单位可能会被屏蔽,因此我们将无法启动它。 如果我们尝试启动蒙面单位,将使用 start 命令提供输出。
systemctl start servicename.service
Failed to start servicename.service: Unit is masked.
取消屏蔽单元很简单,并且会将单元返回到可以启动或启用的状态。
systemctl unmask servicename.service
创建单元文件
有时,我们可能需要为自定义守护程序或现有服务的另一个实例创建一个单元文件。 单元文件的创建是通过 /etc/systemd/system/ 目录中的 root 用户执行的。 这是这样完成的。
touch /etc/systemd/system/servicename.service
chmod 644 /etc/systemd/system/servicename.service
接下来,我们将在文本编辑器(如 vim 或 nano)中打开新创建的单元文件并添加服务配置选项。 下面,我们可以看到一个基本的 example 的单元文件。
[Unit]
Description=This is the manually created service
After=network.target
[Service]
ExecStart=/path/to/executable
[Install]
WantedBy=multi-user.target
在我们继续之前,让我们快速分解这些设置的含义:
- 描述: description 是对服务的描述,当我们对创建的服务使用 systemctl status 命令时会显示出来。
- 后:After 设置表示只有在指定目标或其他服务启动后,服务才会在重新启动时启动。
- 执行开始: ExecStart 是服务的实际可执行文件的路径。
- 通缉者: WantedBy 设置说明了服务应该在哪个目标下启动。 这类似于运行级别。
创建服务文件后,我们需要使用以下命令将其告知系统。
systemctl daemon-reload
systemctl start servicename.service
查看单元文件
一旦创建了单元文件,我们不一定需要导航到文件本身来查看里面写了什么。 systemctl 命令有一个功能,可以为我们显示单元文件的内容。 可以使用以下命令执行。
systemctl cat servicename.service
查看依赖项
就像我们在单元文件中看到的一样,我们也可以使用以下命令来显示该单元的依赖关系树。
systemctl list-dependencies servicename.service
[root@host ~]# systemctl list-dependencies httpd.service
httpd.service
● ├─-.mount
● ├─system.slice
● └─basic.target
● ├─microcode.service
● ├─rhel-dmesg.service
● ├─[email protected]
● ├─paths.target
● ├─slices.target
● │ ├─-.slice
● │ └─system.slice
…
有一些有用的标志可以添加到命令中,例如 –all 标志以递归方式列出所有依赖项,或 –reverse 以相反的顺序列出它们。 还有 –before 和 –after 标志用于显示在指定单位之前或之后开始的单位。
查看属性
此外,我们可以使用 show 命令查看单元的属性。
systemctl show servicename.service
This will give you output similar to the one below.
[root@host ~]# systemctl show httpd.service
Type=notify
Restart=no
NotifyAccess=main
RestartUSec=100ms
TimeoutStartUSec=1min 30s
TimeoutStopUSec=1min 30s
WatchdogUSec=0
WatchdogTimestamp=Thu 2020-06-25 05:43:53 EDT
如果您正在寻找单个设置,您可以使用带有设置名称的 -p 标志。 为了 example要获取正在运行的服务的 PID,请使用此命令。
[root@host ~]# systemctl show httpd.service -p MainPID
MainPID=4004
编辑单元文件
在需要修改单元文件的情况下,systemctl 有一个内置的编辑系统,允许我们修改单元文件,而无需在服务器上搜索它们。 这可以使用编辑命令来完成。
systemctl edit httpd.service
这将在 /etc/systemd/system 中创建一个目录,该目录与服务名称相同,并附加了一个 .d 。 它看起来像这样:/etc/systemd/system/httpd.service.d。
这是存储编辑的地方,并且此文件中的任何指令都将覆盖主单元文件。 在该目录中创建的片段将命名为 override.conf。 如果我们希望使用文件本身进行编辑而不是创建片段,我们可以使用以下命令。
systemctl edit --full httpd.service
删除单元文件
可以使用以下命令来删除单元文件和覆盖片段。
rm -r /etc/systemd/system/httpd.service.d
我们可以使用下面的命令来删除片段目录,它会覆盖指令并删除完整的修改单元文件。
rm /etc/systemd/system/httpd.service
每当我们进行编辑或删除任何单元文件时,我们需要确保使用此命令应用更改。
systemctl daemon-reload
使用目标(运行级别)
什么是系统目标?
当涉及到单元文件时,有一些特殊的文件,我们称之为目标,用于描述系统状态或同步点。 这些文件可以通过称为 .target 的后缀来标识。
这些 .target 文件有什么用? 它们可用于将系统更改为某些状态,类似于其他 init 系统使用运行级别的方式。
列出目标
服务器系统上有许多目标文件,我们可以使用以下命令列出它们。
systemctl list-unit-files --type=target
在使用运行级别时,一次激活一个运行级别,但对于目标,我们可以一次激活多个目标。 为了查看所有活动目标,我们使用以下命令。
systemctl list-units --type=target
停止或重新启动服务器
最后,我们可以使用 systemctl 来停止服务器、关闭它或重新启动它。 为了停止服务器,我们使用以下停止命令。
systemctl halt
要完全关闭服务器,我们使用 poweroff 命令。
systemctl poweroff
要重新启动服务器,我们可以使用 reboot 命令。
systemctl reboot
结论
Systemctl 实用程序是一个灵活、通用且易于使用的工具,我们可以通过它监督 systemd 系统并与之交互,以通过服务管理器创建、修改或删除单元文件。
通过提供以上信息,我们希望您对 systemctl 如何与 init 系统交互有更好的理解,更好地掌握服务器的整体任务管理。
我们的支持团队由经验丰富且才华横溢的 Linux 技术人员和系统管理员组成,他们对多种 Web 托管技术(尤其是本文中讨论的技术)有着深入的了解。
如果您是完全托管的 VPS 服务器, Cloud 专用,VMWare 私有 Cloud私人父母服务器或专用服务器所有者,并且您对执行概述的任何步骤感到不舒服,可以通过电话 @800.580.4985 联系我们, 聊天 或支持票以帮助您完成此过程。