分享最新优惠信息
购买主机更加划算

Linux系统使用Shell脚本在Systemd中创建和运行新的服务单元

几天前,小编偶然发现了一个Centos 8 32 位发行版,于是很想在一台旧的32位Linux机器上测试它。启动后,发现有一个错误,并且正在丢失网络连接,每次启动后都必须手动“打开”网络连接。所以,第一时间想到的是设置一个脚本来完成这项工作,并在每次启动机器时自动运行。

其实这个很容易实现,可以借助服务单元来完成。在本文中,小编简单介绍如何使用服务单元的系统方式。当然,首先是简单介绍一下服务单元。

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

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

简单来说,目标就是服务单元的集合。如果你想查看在你的graphical.target级别中运行的服务单元,具体请运行以下命令:

# systemctl --type=service

列出CentOS中的所有服务单元

正如上图所看到的,有些服务始终处于活动状态并“运行” ,而其它服务则一次性运行并终止(退出)。如果要检查服务的状态,可以使用systemctl命令,如下所示:

# systemctl status firewalld.service

检查CentOS中的服务状态

正如你所看到的,小编检查了firewalld.service状态(提示:也可以使用自动完成服务名称),它显示我的firewalld服务一直在运行并且已启用。

启用和禁用分别表示该服务在下次启动时是否永久加载。此外,启动和停止服务有当前会话的限制,并且不是永久性的。例如,如果输入:

# systemctl stop firewalld.service
# systemctl status firewalld.service

在CentOS 7中管理服务

你可以看到firewalld.service文件处于非活动状态(已终止),但仍处于启用状态,这意味着在下次启动期间它将被加载。因此,如果我们希望将来在启动时加载某个服务,我们必须启用它,这个应该非常简单的了。

所以,如果你访问该文件夹​​:

# cd /etc/systemd/system
# ls -l

SystemD系统文件

可以看到一些单元服务的链接文件和一些“wants”的目标目录。例如,当引导过程达到其级别时,多用户目标想要加载的内容列在名称为/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

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

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

只需启用它并检查:

# systemctl enable connection.service

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

# ls multi-user.target.wants/

在CentOS中启用服务

如上所示,“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文件夹中创建的该文件。

确认服务状态

以上就是在使用Shell脚本在Systemd中创建和运行新的服务单元简单方法,希望可以帮助大家更好的理解Linux系统启动期间的服务、需求、目标和运行脚本概念。

未经允许不得转载:惠主机 » Linux系统使用Shell脚本在Systemd中创建和运行新的服务单元