Systemd 基础:使用服务、单元和日志

介绍

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

在本指南中,我们将为您快速介绍管理启用systemd的服务器所需了解的最重要命令。 这些命令应该适用于任何实现systemd的服务器(任何Ubuntu 15.04及以上版本、Debian 8、CentOS 7、Fedora 15)。 让我们开始吧。

基本单元管理

systemd管理和执行的基本对象是“单元”。 单元可以是许多类型,但最常见的类型是“服务”(以.service为扩展名的单元文件表示)。 要在启用systemd的服务器上管理服务,我们的主要工具是systemctl命令。

所有常规的初始化系统命令都有systemctl命令的等效操作。 我们将使用nginx.service单元来演示(您需要使用软件包管理器安装Nginx以获取此服务文件)。

例如,我们可以输入以下命令来启动服务:

  1. sudo systemctl start nginx.service

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

  1. sudo systemctl stop nginx.service

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

  1. sudo systemctl restart nginx.service

要尝试重新加载服务而不中断正常功能,我们可以输入:

  1. sudo systemctl reload nginx.service

启用或禁用单元

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

要使服务在启动时自动启动,请输入:

  1. sudo systemctl enable nginx.service

如果您希望再次禁用服务,请输入:

  1. sudo systemctl disable nginx.service

获取系统状态概述

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

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

  1. systemctl list-units

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

  1. systemctl list-units --all

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

  1. systemctl list-unit-files

查看基本日志信息

A systemd component called journald collects and manages journal entries from all parts of the system. This is basically log information from applications and the kernel.

要查看所有日志条目,从最旧的条目开始,请键入:

  1. journalctl

默认情况下,如果journald配置为保存上一次引导记录,则会显示当前引导和上一次引导的条目。 一些发行版默认启用此功能,而其他发行版则不启用(要启用此功能,请编辑/etc/systemd/journald.conf文件并将Storage=选项设置为“persistent”,或通过键入sudo mkdir -p /var/log/journal创建持久目录)。

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

  1. journalctl -b

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

  1. journalctl -k

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

  1. journalctl -k -b

查询单元状态和日志

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

要查看单个单元当前状态的概述,可以使用systemctl命令的status选项。这将显示单元是否处于活动状态、有关进程的信息以及最新的日志条目:

  1. systemctl status nginx.service

要查看有关所讨论单元的所有日志条目,请使用journalctl命令并提供-u选项和单元名称:

  1. journalctl -u nginx.service

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

  1. journalctl -b -u nginx.service

检查单元和单元文件

到目前为止,您已经知道如何通过启动或停止单元来修改单元的状态,并且知道如何查看状态和日志信息以了解进程的运行情况。但是,我们还没有看到如何检查单元和单元文件的其他方面。

A unit file contains the parameters that systemd uses to manage and run a unit. To see the full contents of a unit file, type:

  1. systemctl cat nginx.service

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

  1. systemctl list-dependencies nginx.service

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

  1. systemctl list-dependencies --all nginx.service

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

  1. systemctl show nginx.service

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

修改单位文件

如果您需要对单位文件进行修改,systemd允许您直接从systemctl命令进行更改,以避免必须转到实际的磁盘位置。

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

  1. sudo systemctl edit nginx.service

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

  1. sudo systemctl edit --full nginx.service

修改单位文件后,您应重新加载systemd进程本身以应用您的更改:

  1. sudo systemctl daemon-reload

使用目标(运行级别)

另一个初始化系统的功能是在不同状态之间转换服务器本身。传统的初始化系统通常将这些称为“运行级别”,允许系统一次只能处于一个运行级别。

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

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

  1. systemctl list-unit-files --type=target

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

  1. systemctl get-default

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

  1. sudo systemctl set-default multi-user.target

要查看绑定到目标的单元,您可以键入:

  1. systemctl list-dependencies multi-user.target

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

  1. sudo systemctl isolate multi-user.target

停止或重新启动服务器

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

  1. sudo systemctl poweroff

如果您想重新启动系统,可以通过输入:

  1. sudo systemctl reboot

要进入救援模式,请键入:

  1. sudo systemctl rescue

请注意,大多数操作系统都包含传统的别名以执行这些操作,因此您可以简单地键入sudo poweroffsudo reboot而不需要systemctl。 但是,并不保证所有系统都设置了这些别名。

下一步

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

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

Source:
https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal