myfreax

如何自定义Linux systemd单元文件

在本教程中,我们将讨论systemctl命令,它是用于控制初始化系统的中央管理工具。我们将介绍如何查看服务依赖,单元文件的定义,使用配置文件,检查单元属性

6 min read
By myfreax
如何自定义Linux systemd单元文件

systemd是一个初始化系统和系统管理器,已成为Linux发行版的新标准。由于它的大量采用,因此你必须学会使用systemd,因为它将使管理服务器变得相当容易。

了解systemd和使用其中包含的工具和守护程序将帮助您更好地了解它提供的强大功能、灵活性,或者帮助您更轻松地完成工作。

在本教程中,我们将讨论systemctl命令,它是用于控制初始化系统的中央管理工具。我们将介绍如何查看服务依赖,单元文件的定义,使用配置文件,检查单元属性。

尽管systemd已成为许多Linux发行版的默认初始化系统,但它并未在所有发行版中普遍实现。

在您阅读本教程时,如果您的终端输出错误,bash: systemctl is not installed那么您的系统并没有使用systemd作为Linux的初始化系统。

初始化系统的基本目的是初始化Linux内核启动后必须启动的组件。初始化系统还用于在系统运行时管理服务器的服务和守护程序。

systemd中,大多数操作的目标是单元unit,单元按它们所代表的资源类型进行分类,并使用称为单元文件的文件进行定义。每个单元的类型可以从文件末尾的后缀中推断出来。

对于服务,目标单元是服务单元,其单元文件后缀为.service但是,对于大多数服务管理命令。

您可以省略.service后缀,因为systemd会自动判断,可以知道在使用服务管理命令时您可能想要对服务进行操作。

到目前为止,我们一直在使用服务并显示systemd单元和单元文件的信息。但是,我们可以使用一些systemctl的子命令找到指定单位的更多具体信息。

比如要显示systemd已加载到其系统中的单元文件,您可以使用cat命令,这是在systemd209版中添加的。例如,要查看atd调度守护进程的单元文件。

可以运行命令sudo systemctl cat atd.servicesystemd输出的是当前正在运行进程的单元文件。

如果您最近修改了单元文件,或者您正在覆盖单元文件片段中的某些选项,它将不会打印你最新的修改。

sudo systemctl cat atd.service
Output[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target

显示依赖

要查看单元的依赖关系树,可以使用list-dependencies命令。这将显示一个层级结构,映射为启动单元必须处理的依赖关系。

默认的显示方式依赖关系的方式是父级的单元是子级单元必须或需要依赖的单元。list-dependencies默认仅显示用于.target指示系统状态的单元。要递归列出所有依赖项,请使用--all选项。

为了更易于查看指定单元的依赖。您可以将--reverse选项添加到命令中。它将会以反转的方式显示指定单元的依赖。

sudo systemctl list-dependencies
sudo systemctl list-dependencies --all
sudo systemctl list-dependencies nginx
sudo systemctl list-dependencies --reverse nginx

查看单元属性

要查看单元的低级属性,可以使用show命令。这将使用key=value格式显示为指定单元设置的属性列表。

如果要显示单个属性,可以传递-p并指定属性的名称。例如,要查看sshd.service单元的描述。你可运行命令sudo systemctl show sshd.service -p Description

sudo systemctl show sshd.service
sudo systemctl show sshd.service -p Description

单元掩蔽和取消掩蔽

我们在systemd的服务管理中提到了如何停止或禁用服务。除了使用启用或者禁用之外。systemd还可以单元链接到/dev/null来实现同样的目的,这称为屏蔽单元。

sudo systemctl mask nginx.service这将阻止Nginx服务自动或手动启动,它将被屏蔽。

如果您运行命令sudo systemctl list-unit-files | grep nginx检查nginx服务状态,您将看到该服务现在被标记为屏蔽。

sudo systemctl mask nginx.service
sudo systemctl list-unit-files | grep nginx

如果您尝试运行命令sudo systemctl start nginx.service启动该服务,您将看到消息OutputFailed to start nginx.service: Unit nginx.service is masked。

要取消屏蔽某个单元,使其再次可用,请使用unmask命令。这将使设备返回到之前的状态,允许它被启动或启用。

sudo systemctl unmask nginx.service

编辑单元文件

虽然单元文件的特定格式超出了本教程的范围,但如果您需要进行调整,它提供了用于编辑和修改单元文件的内置机制。此功能是在systemd版本218中添加的。

默认情况下,edit命令将为指定单元打开一个单元文件的片段。这是一个空白文件,可用于覆盖或添加指令到单元文件。

并在/etc/systemd/system目录中创建一个以单元名称开头包含.d的目录,例如命令sudo systemctl edit nginx.service将创建一个名为nginx.service.d的目录。

在此目录中,将创建一个名为override.conf的文件。在加载单元文件时,systemd将在内存中将覆盖片段与完整的单元文件合并。

片段的指令将优先于原始单元文件中的指令。如果你想编辑完整的单元文件而不是创建一个片段,你可以传递--full选项。

这会将当前的单元文件加载到编辑器中,可以在nano编辑器中对其进行修改。当编辑器退出时。文件的所有更改将被写入/etc/systemd/system目录下单元定义的文件中

sudo systemctl edit nginx.service
sudo systemctl edit --full nginx.service

撤销/删除单元文件修改

如果你想要删除使用edit命令所做的任何更改,请删除配置目录/etc/systemd/system/nginx.service.d

要删除使用--full选项修改的单元文件,可以运行命令sudo rm /etc/systemd/system/nginx.service

删除文件或目录后,您应该重新加载systemd进程,以便它不再尝试引用这些文件并恢复使用系统副本。

当你删除nginx服务所作修改的后,nginx将会使用在安装时创建服务定义文件重新启动Nginx。Nginx服务的默认配置位于/lib/systemd/system/nginx.service

sudo rm /etc/systemd/system/nginx.service
sudo systemctl daemon-reload