如何自定义Linux systemd单元文件
在本教程中,我们将讨论systemctl命令,它是用于控制初始化系统的中央管理工具。我们将介绍如何查看服务依赖,单元文件的定义,使用配置文件,检查单元属性
systemd是一个初始化系统和系统管理器,已成为Linux发行版的新标准。由于它的大量采用,因此你必须学会使用systemd,因为它将使管理服务器变得相当容易。
了解systemd
和使用其中包含的工具和守护程序将帮助您更好地了解它提供的强大功能、灵活性,或者帮助您更轻松地完成工作。
在本教程中,我们将讨论systemctl
命令,它是用于控制初始化系统的中央管理工具。我们将介绍如何查看服务依赖,单元文件的定义,使用配置文件,检查单元属性。
尽管systemd
已成为许多Linux发行版的默认初始化系统,但它并未在所有发行版中普遍实现。
在您阅读本教程时,如果您的终端输出错误,bash: systemctl is not installed
那么您的系统并没有使用systemd
作为Linux的初始化系统。
初始化系统的基本目的是初始化Linux内核启动后必须启动的组件。初始化系统还用于在系统运行时管理服务器的服务和守护程序。
在systemd
中,大多数操作的目标是单元unit,单元按它们所代表的资源类型进行分类,并使用称为单元文件的文件进行定义。每个单元的类型可以从文件末尾的后缀中推断出来。
对于服务,目标单元是服务单元,其单元文件后缀为.service
但是,对于大多数服务管理命令。
您可以省略.service
后缀,因为systemd
会自动判断,可以知道在使用服务管理命令时您可能想要对服务进行操作。
到目前为止,我们一直在使用服务并显示systemd
单元和单元文件的信息。但是,我们可以使用一些systemctl的子命令找到指定单位的更多具体信息。
比如要显示systemd
已加载到其系统中的单元文件,您可以使用cat
命令,这是在systemd
209版中添加的。例如,要查看atd
调度守护进程的单元文件。
可以运行命令sudo systemctl cat atd.service
。systemd
输出的是当前正在运行进程的单元文件。
如果您最近修改了单元文件,或者您正在覆盖单元文件片段中的某些选项,它将不会打印你最新的修改。
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