如何在Systemd中使用Shell脚本创建和运行新的服务单元

在本文中,我将解释如何创建新的服务和单元,并使它们在systemd(系统和服务管理器)基于Linux的系统引导下运行

前几天,我碰到一个CentOS 7 32位的发行版,我觉得测试它的旧的32位计算机上的愿望。 开机后我意识到,它有一个缺陷,它是失去的网络连接,我不得不把它“上升”手动开机后每次。 所以,问题是如何设置一个脚本做这个工作,每次我启动我的机器运行?

好吧,这很简单,我会向您展示使用服务单元的systemd方式。 但首先简要介绍一下服务单位。

在这篇文章中,我打算去解释什么是“服务单位”systemd是,如何轻松地创建和运行一个。 我会尽量简化什么是“目标”是,为什么我们称他们为“单位集合”,什么是他们的“希望”。 最后,我们利用服务单元在引导过程之后运行我们自己的脚本。

很明显,您的计算机是有用的,由于它提供的服务,为了有这个功能,许多服务必须被称为计算机引导和达到不同的水平。 其他的服务被调用时,当它到达多用户级别( 级别3)的计算机到达例如救援水平( 运行级别0)和其他被执行。 你可以想像这些水平的目标

以简单的方式target是服务单元的集合。 如果你想看看你的graphical.target水平,键入运行服务单位:

# systemctl --type=service
列出CentOS 7中的所有服务单元

列出CentOS 7中的所有服务单元

正如你所看到的一些服务是活动的,“跑”的所有时间,而其他运行一次并终止(退出)。 如果要检查服务的状态,请键入:

# systemctl status firewalld.service
检查CentOS 7中的服务状态

检查CentOS 7中的服务状态

正如你可以看到我检查的状态firewalld.service提示:你可以使用自动完成该服务的名称)。 它告诉我,firewalld服务正在运行的所有的时间,它已启用。

不要错过: 如何在CentOS 7配置FirewallD服务

启用和禁用表示在下次引导期间,服务将永久加载或不加载。 另一方面,启动和停止服务具有当前会话的限制,它不是永久的。

例如,如果您键入:

# systemctl stop firewalld.service
# systemctl status firewalld.service
管理CentOS 7中的服务

管理CentOS 7中的服务

你可以看到, firewalld.service处于非活动状态(死),但它仍处于启用状态,这意味着下次开机时就会被加载。 因此,如果我们想要在将来的引导期间加载服务,我们必须启用它。 什么是一个伟大的结论! 让我们创建一个,很容易。

如果你去的文件夹:

# cd /etc/systemd/system
# ls -l
SystemD系统文件

SystemD系统文件

你可以看到单位服务的一些链接文件和目标的“欲望”的一些目录。 例如:什么样的多用户目标时,要在引导过程达到其级别要加载,列出与名称/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
在CentOS 7中创建新的服务单元

在CentOS 7中创建新的服务单元

为说明上述情况:我们已经创建的服务类型的单位(你也可以创建目标类型的单位),我们将其设置为network.target后加载(你可以理解,在引导过程达到一个定义的目标顺序),我们希望每一次服务启动名为conup.sh,我们将创建执行bash脚本。

这项活动开始于最后一部分[安装]。 它告诉将由“multi-user.target”被通缉。 因此,如果我们让我们的服务,该服务的符号链接将多user.target.wants文件夹内创建! 得到它了? 如果我们禁用它的链接将被删除。 很简单。

只需启用它并检查:

# systemctl enable connection.service

它告诉我们, 在多user.target.wants文件夹中的符号链接已创建。 核实:

# ls multi-user.target.wants/
在CentOS 7中启用服务

在CentOS 7中启用服务

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

# cd /root
# mkdir scripts
# cd scripts
# vim conup.sh

添加下面一行Vim内部并保存:

#!/bin/bash
nmcli connection up enp0s3

当然,如果你想要你的脚本执行别的东西,你可以输入任何你想要的,而不是第二行。

例如,

#!/bin/bash
touch /tmp/testbootfile

将里面创建一个文件/ tmp文件夹(只是为了检查您的服务工作)。

我们还必须使脚本可执行:

# chmod +x conup.sh

现在我们准备好了。 如果你不想等待下一次启动(它已经启用),我们可以启动当前会话类型的服务:

# systemctl start connection.service

Voila! 我的连接正常运行!

如果你已经选择了写命令“Touch的/ tmp / testbootfile”的剧本里面,只是为了检查其功能,你会看到/中创建该文件临时文件夹

确认服务状态

确认服务状态

我真的希望帮助你弄清楚在启动期间什么服务,想要,目标和运行脚本是关于。