SystemdEssentials:使用服务、单元和日志

来自菜鸟教程
跳转至:导航、​搜索

介绍

近年来,Linux 发行版越来越多地从其他 init 系统过渡到 systemdsystemd 工具套件提供了一个快速灵活的初始化模型,用于从引导开始管理整个机器。

在本指南中,我们将让您快速了解管理启用 systemd 的服务器时需要了解的最重要的命令。 这些应该可以在任何实现 systemd 的服务器上运行(任何操作系统版本等于或高于 Ubuntu 15.04、Debian 8、CentOS 7、Fedora 15)。 让我们开始吧。

基本单位管理

systemd管理和作用的基本对象是一个“单元”。 单元可以有多种类型,但最常见的类型是“服务”(由以 .service 结尾的单元文件表示)。 要在启用了 systemd 的服务器上管理服务,我们的主要工具是 systemctl 命令。

所有正常的 init 系统命令都具有与 systemctl 命令等效的操作。 我们将使用 nginx.service 单元进行演示(您必须使用包管理器安装 Nginx 才能获取此服务文件)。

例如,我们可以通过键入以下内容来启动服务:

sudo systemctl start nginx.service

我们可以通过键入以下内容再次停止它:

sudo systemctl stop nginx.service

要重启服务,我们可以输入:

sudo systemctl restart nginx.service

要尝试在不中断正常功能的情况下重新加载服务,我们可以键入:

sudo systemctl reload nginx.service

启用或禁用单位

默认情况下,大多数 systemd 单元文件不会在启动时自动启动。 要配置此功能,您需要“启用”单元。 这会将它连接到某个启动“目标”,从而在启动该目标时触发它。

要使服务在引导时自动启动,请键入:

sudo systemctl enable nginx.service

如果您想再次禁用该服务,请键入:

sudo systemctl disable nginx.service

获取系统状态概览

我们可以从 systemd 服务器中提取大量信息,以获取系统状态的概览。

例如,要获取 systemd 列为“活动”的所有单元文件,请键入(您实际上可以不使用 list-units,因为这是默认的 systemctl 行为):

systemctl list-units

要列出 systemd 已加载或尝试加载到内存中的所有单元,包括当前未激活的单元,请添加 --all 开关:

systemctl list-units --all

要列出系统上安装的所有单元,包括 systemd 未尝试加载到内存中的单元,请键入:

systemctl list-unit-files

查看基本日志信息

称为 journaldsystemd 组件收集和管理来自系统所有部分的日记帐分录。 这基本上是来自应用程序和内核的日志信息。

要查看所有日志条目,从最早的条目开始,输入:

journalctl

默认情况下,如果 journald 配置为保存以前的引导记录,这将显示当前和以前引导的条目。 某些发行版默认启用此功能,而其他发行版则不启用此功能(要启用此功能,请编辑 /etc/systemd/journald.conf 文件并将 Storage= 选项设置为“persistent”,或通过键入 [X202X ])。

如果您只想查看当前引导的日志条目,请添加 -b 标志:

journalctl -b

要仅查看内核消息,例如那些通常由 dmesg 表示的消息,您可以使用 -k 标志:

journalctl -k

同样,您可以通过附加 -b 标志将其仅限于当前引导:

journalctl -k -b

查询单位状态和日志

虽然上述命令使您可以访问一般系统状态,但您还可以获得有关各个单元状态的信息。

要查看单元当前状态的概览,您可以将 status 选项与 systemctl 命令一起使用。 这将向您显示该单元是否处于活动状态、有关流程的信息以及最新的日记帐分录:

systemctl status nginx.service

要查看相关单位的所有日记帐分录,请将带有单位名称的 -u 选项提供给 journalctl 命令:

journalctl -u nginx.service

与往常一样,您可以通过添加 -b 标志将条目限制为当前引导:

journalctl -b -u nginx.service

检查单元和单元文件

到现在为止,您知道如何通过启动或停止来修改单元的状态,并且您知道如何查看状态和日志信息以了解该过程发生了什么。 但是,我们还没有看到如何检查单元和单元文件的其他方面。

单元文件包含 systemd 用于管理和运行单元的参数。 要查看单元文件的完整内容,请键入:

systemctl cat nginx.service

要查看单元的依赖关系树(启动单元时将尝试激活哪些单元 systemd),请键入:

systemctl list-dependencies nginx.service

这将显示依赖的单位,target 单位递归展开。 要递归扩展所有依赖单元,请传递 --all 标志:

systemctl list-dependencies --all nginx.service

最后,要查看系统上单位设置的低级详细信息,可以使用 show 选项:

systemctl show nginx.service

这将为您提供由 systemd 管理的每个参数的值。

修改单元文件

如果您需要对单元文件进行修改,systemd 允许您从 systemctl 命令本身进行更改,这样您就不必转到实际的磁盘位置。

要添加可用于附加或覆盖默认单元文件中的设置的单元文件片段,只需调用单元上的 edit 选项:

sudo systemctl edit nginx.service

如果您希望修改单元文件的全部内容而不是创建片段,请传递 --full 标志:

sudo systemctl edit --full nginx.service

修改单元文件后,您应该重新加载 systemd 进程本身以获取您的更改:

sudo systemctl daemon-reload

使用目标(运行级别)

init 系统的另一个功能是在不同状态之间转换服务器本身。 传统的 init 系统通常将这些称为“运行级别”,允许系统在任何时候仅处于一个运行级别。

systemd 中,改为使用“目标”。 目标基本上是服务器可以用来使服务器进入特定状态的同步点。 服务和其他单元文件可以绑定到一个目标,并且多个目标可以同时处于活动状态。

要查看系统上所有可用的目标,请键入:

systemctl list-unit-files --type=target

要查看 systemd 在引导时尝试到达的默认目标(依次启动构成该目标的依赖关系树的所有单元文件),请键入:

systemctl get-default

您可以使用 set-default 选项更改将在启动时使用的默认目标:

sudo systemctl set-default multi-user.target

要查看哪些单位与目标相关联,您可以键入:

systemctl list-dependencies multi-user.target

您可以使用 isolate 选项修改系统状态以在目标之间转换。 这将停止任何未绑定到指定目标的单位。 确保您隔离的目标不会停止任何基本服务:

sudo systemctl isolate multi-user.target

停止或重新启动服务器

对于系统可以转换到的一些主要状态,可以使用快捷方式。 例如,要关闭服务器,您可以键入:

sudo systemctl poweroff

如果您希望重新启动系统,可以通过键入以下命令来完成:

sudo systemctl reboot

您可以通过键入以下命令进入救援模式:

sudo systemctl rescue

请注意,大多数操作系统都包含这些操作的传统别名,因此您只需键入 sudo poweroffsudo reboot 而无需 systemctl。 但是,这不能保证在所有系统上都设置。

下一步

至此,您应该了解如何管理使用 systemd 的服务器的基础知识。 但是,随着您的需求扩大,还有很多东西需要学习。 以下是指南的链接,其中包含有关我们在本指南中讨论的某些组件的更深入信息:

通过学习如何利用您的 init 系统的优势,您可以控制机器的状态并更轻松地管理您的服务和流程。