网站搜索

如何在 Systemd 中创建和运行新的服务单元


几天前,我偶然发现了一个 Centos 8 32 位发行版,我很想在一台旧的 32 位机器上测试它。启动后,我意识到它有一个错误,并且正在丢失网络连接,每次启动后我都必须手动“向上”。所以,问题是我如何设置一个脚本来完成这项工作,并在每次启动机器时运行?

嗯,这很简单,我将向您展示使用服务单元的系统方式。首先简单介绍一下服务单位。

在本文中,我将解释 systemd 中的“服务单元”是什么,以及创建和运行它是多么容易。我将尝试简化什么是“目标”,为什么我们称它们为“单元集合”以及它们的“想要”。最后,我们利用服务单元在启动过程后运行我们自己的脚本。

显然,您的计算机由于其提供的服务而很有用,并且为了具有此功能,必须在计算机启动并达到不同级别时调用许多服务。

其他服务在计算机达到救援级别(运行级别 0)时调用执行,其他服务在达到多用户级别(运行级别 3)时调用执行。您可以将这些级别想象为目标

简单来说,目标是服务单元的集合。如果您想查看在 graphical.target 级别中运行的服务单元,请输入:

systemctl --type=service

正如您所看到的,一些服务处于活动状态并且始终“运行”,而其他服务则一次性运行并终止(退出)。

如果要检查服务的状态,可以使用 systemctl 命令,如下所示。

systemctl status firewalld.service

如您所见,我检查了 firewalld.service 的状态(提示: 您可以使用自动完成服务名称)。它通知我 firewalld 服务一直在运行并且已启用。

启用和禁用分别表示该服务在下次启动时是否永久加载。另一方面,启动和停止服务有当前会话的限制,并且不是永久性的。

例如,如果您输入:

systemctl stop firewalld.service
systemctl status firewalld.service

您可以看到 firewalld.service 处于非活动状态(死亡),但它仍然处于启用状态,这意味着在下次启动期间它将被加载。因此,如果我们希望将来在启动时加载某个服务,我们必须启用它。多么好的结论啊!让我们创建一个,这很容易。

如果您转到该文件夹:

cd /etc/systemd/system
ls -l

您可以看到单元服务的一些链接文件以及目标的“想要”的一些目录。例如,当引导过程达到其级别时,多用户目标想要加载的内容列在名为 /etc/systemd/system/multi-user.target.wants/ 的目录中。

ls multi-user.target.wants/

正如您所看到的,它不仅包含服务,还包含其他目标,它们也是服务的集合。

让我们创建一个名为 connection.service 的服务单元。

vim connection.service

并输入以下内容(按 “i ” 进入插入模式),保存并退出(使用 “esc ”“:wq! ” ) :

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

解释一下上面的内容:我们创建了一个service类型的单元(你也可以创建target类型的单元),并且我们将其设置为在network.target之后加载(你可以理解为启动过程按照定义的顺序到达目标),我们希望每次服务启动时都执行一个名为 conup.sh 的 bash 脚本,我们将创建该脚本。

有趣的是最后一部分[安装]。它表明“multi-user.target ”将需要它。因此,如果我们启用我们的服务,将在 multi-user.target.wants 文件夹内创建指向该服务的符号链接!知道了?如果我们禁用它,该链接将被删除。很简单。

只需启用它并检查:

systemctl enable connection.service

它通知我们 multi-user.target.wants 文件夹中的符号链接已创建。您可以通过运行 ls 命令进行确认,如图所示。

ls multi-user.target.wants/

如您所见,“connection.service”已准备好下次启动,但我们必须先创建脚本文件。

cd /root
mkdir scripts
cd scripts
vim conup.sh

Vim 中添加以下行并保存:

#!/bin/bash
nmcli connection up enp0s3

nmcli 命令用于启动 enp0s3 接口的网络连接。

当然,如果您希望脚本执行其他操作,您可以输入您想要的任何内容而不是第二行。

例如,

#!/bin/bash
touch /tmp/testbootfile

这将在 /tmp 文件夹中创建一个文件(只是为了检查您的服务是否正常工作)。

我们还必须通过运行 chmod 命令使脚本可执行,如图所示。

chmod +x conup.sh

现在我们准备好了。如果您不想等到下次启动(它已经启用),我们可以通过键入以下内容启动当前会话的服务:

systemctl start connection.service

瞧!我的连接已启动并正在运行!

如果您选择在脚本中写入命令“touch /tmp/testbootfile”,只是为了检查其功能,您将看到在/tmp文件夹中创建此文件。

我真的希望能帮助您弄清楚启动期间的服务、需求、目标和运行脚本都是关于什么的。