一.背景
当我们在对计算机进行操作时,可能会遇到操作简单但步骤重复的情况,所以我们这时可以选择新建一个脚本且自定义一个服务来简化这些重复地操作。systemd自定义服务管理功能十分强大且灵活,它为Linux系统管理员提供了一种高效、可靠的方式来定义、启动、停止和监控自定义服务。通过systemd的自定义服务管理功能,管理员可以轻松地创建、配置和管理各种复杂的自定义服务,以满足不同应用场景的需求。无论是简单的后台任务还是复杂的分布式系统,systemd都能提供稳定、可靠的服务管理支持。
术语解释
shell:
Shell是一种应用程序,它为用户提供了一个界面,通过这个界面,用户可以访问操作系统内核的服务。Shell是用C语言编写的程序,它是用户与Linux系统交互的桥梁。Shell既是一种命令语言,又是一种程序设计语言。
Shell的主要功能包括执行命令、管理文件和目录、管理环境变量、支持管道和I/O重定向等。通过Shell,用户可以在命令行中输入命令并执行,Shell会将命令转换为操作系统能够理解的指令并执行相应的操作。此外,Shell还可以用于创建、删除、移动和复制文件和目录,以及设置、修改和删除环境变量。
在Shell脚本编程中,Shell脚本是一种为Shell编写的脚本程序,用于自动化和批量处理任务。Shell脚本在Unix/Linux系统中广泛使用,可以用于编写自动化脚本,完成一系列重复性、繁琐的任务,如备份数据、定期清理文件、定时执行任务等。此外,Shell脚本还可以用于系统管理和维护、日志分析以及数据处理等场景。
常见的Shell种类包括Bourne Shell(sh)、Bash Shell(bash)、Korn Shell(ksh)、C Shell(csh)和Z Shell(zsh)等。其中,bash是GNU计划的一部分,由布莱恩·福克斯于1987年创造,是目前Linux系统中应用最为广泛的Shell之一。
shell脚本
Shell脚本是一种为Shell编写的脚本程序,用户可以通过Shell脚本将常用的Shell命令组合起来,按顺序执行。简单来说,Shell脚本就是一系列命令的集合,它利用Shell的功能来执行用户定义的一系列操作。
Shell脚本在Unix/Linux系统中发挥着重要的作用,它可以帮助用户自动化完成许多重复性的任务,提高工作效率。通过Shell脚本,用户可以编写复杂的命令序列,实现文件的批量处理、系统的定时任务、网络的管理维护等功能。
二.操作流程
(1)脚本编写以及配置
创建一个名为date_test.sh的脚本,记住脚本文件路径
sudo vim /usr/local/bin/test_sys.sh
# /bin/bash
while true #循环
do
echo 'date'>> /var/log/test.log #输出日期到该文档中
sleep 2 #每隔2s执行一次
done
给改脚本文件添加执行权限
sudo chmod +x /usr/local/bin/test_sys.sh
(2)服务单元创建以及配置
在/etc/systemd/system目录中编辑一个service单元文件,例如date_test.service。或者在其它目录编辑一个service文件,然后再使用mv命令将文件移动到/etc/systemd/system目录。
cd /etc/systemd/system
sudo my_service.service
service文件内容如下
[Unit]
Description=daemon date
[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/test_sys.sh
[Install]
WantedBy=multi-user.target
文件内容详解
service服务文件内容一般分为三部分:[Unit]、[Service]和[Install]。介绍如下
[Unit]部分:提供了关于该服务的服务信息和数据关系
Description:服务的简短描述。
[Service]部分:定义了如何启动和管理服务
Type:定义服务的启动类型,例如simple(立即启动)
ExecStart:定义服务启动时要执行的命令
Restart:定义服务退出时是否重启
[Install]服务:定义了如何将此服务安装到系统中
[WantedBy]:定义哪些目标(target)需要此服务
(3)重新加载systemd,设置自启,启动服务
重新加载 systemd 守护进程配置,执行如下命令
sudo systemctl daemon-reload
设置开机自启
sudo systemctl enable date_test.service
启动该服务
sudo systemctl start date_test.service
查看服务状态
sudo systemctl status date_test.service
结果如下
查看log,执行cat /var/log/test.log
(4)报错排查
若查询服务状态出现服务启动的失败的情况,例如如下
则可以尝试执行sudo systemctl stop haha_service关闭该服务
然后执行
sudo setenforce 1
sudo getenforce
然后再尝试启动服务并查看服务状态是否active
命令解释
setenforce 命令用于动态地更改SELinux的运行模式。
1 :表示启用SELinux的强制模式(Enforcing mode)。在强制模式下,SELinux会严格地根据定义的策略来限制进程和用户对文件、目录、端口等资源的访问。任何违反策略的行为都会被SELinux阻止,并记录到相关的日志中。
0:这将SELinux设置为宽容模式(Permissive mode)。在宽容模式下,SELinux仍然会评估所有的访问请求,但不会阻止任何违反策略的行为。这通常用于调试SELinux策略,以便管理员可以观察哪些操作会被策略阻止,而不实际地阻止它们。
getenforce命令
getenforce命令是一个Linux命令,用于查看SELinux(Security-Enhanced Linux)的执行模式。当你在终端中输入getenforce命令时,系统会返回当前的SELinux执行模式,可能是Enforcing(强制模式)、Permissive(宽容模式)或Disabled(禁用模式)。这个命令的主要作用是帮助系统管理员或用户了解当前系统中SELinux的执行状态,以便进行相关的安全配置和故障排除。此外,getenforce命令也可以用于脚本或自动化任务中,以便在需要时获取系统的SELinux执行模式信息。
三.总结
在进行shell脚本自定义化服务操作中,我总结了一下两点。
1.对于不熟路脚本编写的人来说,分清中英符号,以及书写正确是最基本的要求,否则就大大地延长操作时间。
2.出现未知的错误时,多多参阅他人的经验可以快速解决问题
参考博客:Linux 中如何编写 .service文件 (systemd.service 中文手册)_linux中service编写-CSDN博客