linux系统编写Systemd Service方法,计划任务at命令,crontab命令。

目录

介绍

Systend具体操作

at

crontab命令(周期性计划任务)


介绍

Systemd
一、自定义系统服务作用:
扩展系统功能:通过自定义系统服务,用户或开发者可以扩展操作系统的功能,满足特定的应用或业务需求。这些服务可以涉及系统性能优化、安全管理、数据备份等多个方面,使得系统更加灵活和强大。
实现业务逻辑:对于某些复杂的业务场景,可能需要通过自定义系统服务来实现特定的业务逻辑。这些服务可以集成到系统中,与其他组件协同工作,完成复杂的业务流程。
提升系统安全性:自定义系统服务可以帮助加强系统的安全性。例如,可以开发专门的安全服务来监控系统的安全状态,及时发现并应对潜在的安全威胁。同时,通过自定义服务,还可以对系统的访问权限进行更精细化的控制,防止未经授权的访问和操作。
优化系统性能:针对特定的硬件或应用场景,自定义系统服务可以进行性能优化。例如,可以开发专门的资源管理服务来合理分配系统资源,提高系统的响应速度和吞吐量。
实现定制化需求:不同的用户或企业可能有不同的需求,通过自定义系统服务,可以满足这些特定的需求。无论是定制化的用户界面、特定的数据处理方式还是独特的业务流程,都可以通过自定义服务来实现。
二、server的组成
在Linux中,特别是使用systemd作为初始化系统的系统中,服务单元文件(service unit files)用于定义如何启动、停止、重启和查询系统服务的状态。这些文件通常存放在/etc/systemd/system/或/lib/systemd/system/目录中,并具有.service扩展名。

一个service单元文件通常包含以下几个部分:

[Unit]:这个部分提供了关于单元本身的元数据以及单元之间的依赖关系。例如,你可以指定一个服务在另一个服务之后启动,或者指定一个服务需要某个挂载点或网络连接。

Description=: 服务的简短描述。
After=: 定义本服务应该在哪些其他单元之后启动。
Requires=: 定义本服务启动所依赖的其他单元。
Wants=: 定义与本服务相关的其他单元,但它们的失败不会导致本服务失败。
...还有其他许多选项。
[Service]:这个部分定义了如何启动服务。

Type=: 定义服务的启动类型,如simple(默认),forking,dbus,oneshot,dbus-notify或notify。
ExecStart=: 定义启动服务时要运行的命令。
ExecStop=: 定义停止服务时要运行的命令。
Restart=: 定义服务退出后是否应该自动重启,以及如何重启。
User= 和 Group=: 定义运行服务的用户和组。
WorkingDirectory=: 定义服务的工作目录。
Environment=: 设置环境变量。
TimeoutStartSec=: 定义启动服务的超时时间。
...以及其他许多选项。
[Install]:这个部分定义了如何“安装”这个单元,也就是如何使它成为系统启动的一部分。

WantedBy=: 定义哪些目标(target)需要这个单元。
RequiredBy=: 定义哪些目标需要这个单元,并且如果这个单元失败,那么目标也会失败。
Alias=: 为单元定义别名。

at

Linux的计划任务就和Windows的计划任务一样,可以设置系统在哪个时间执行什么命令或脚本,比如在凌晨的时候对数据库进行备份等工作。

crontab

crontab命令是周期性执行命令,也就是说这个命令设置的计划任务可以周而复始的在指定的时间内执行。


Systend具体操作


一、用shell/c/c++/java编写一个脚本
脚本如下:

[root@localhost ~]# vim systemd_test.sh

#!/bin/bash

while true

do

echo `date`>> /root/systemd_test.txt

sleep 2

done

在脚本执行的时候,会循环(每2秒)把系统时间写入到/root/system_test.txt文件中,执行程序的监控此文件即可。

然后我们给文件赋权:

chmod +x systemd_test.sh

二、配置单元文件
编写systemd service,文件放到/etc/systemd/system目录下。文件内容如下

[root@localhost ~]# vim /etc/systemd/system/systemd_test.service

[Unit]

Description=date daemon

[Service]

ExecStart=/root/systemd_test.sh

Restart=always

Type=simple

[Install]

WantedBy=multi-user.target

然后我们输入如下图代码,这是个保护机制

setenforce 0

执行运行命令:

systemctl daemon-reload

systemctl start systemd_test.service

systemctl status systemd_test.service

如果报错

在Service下面的ExecStart那加入/bin/bash

这样便解决了

最后tail -f /root/systemd_test.txt查看文件

结束后

停止该服务:

systemctl stop systemd_test.service

设置该服务为开机自启动。

systemctl enable systemd_test.service

三、实列
创建一个单调定时器

编写任务脚本文件 以下是一个简单的脚本/root/boot_backup内容

利用命令vim打开脚本

Vim /root/boot_backup

授予脚本执行权限,通过以下命令实现

chmod +x boot_backup

编写一个配套的服务单元文件,将其命名为boot_backup.service保存在/etc/system/system目录中,内容如图

Type值设置为simple(默认值)

ExecStart定义要执行的任务

Vim boot_backup.service打开脚本

编写一个定时器单元文件,将其命名为boot_backup.timer保存在/etc/system/system目录中,内容如下图

Vim boot_backup.timer打开脚本

赋权使脚本生效

完成服务脚本的编写后,需要执行以下命令重新加载所有systemd服务

Systemctl daemon-reload 重新装载单元文件

分别执行以下命令使新建的定时器能开机启动,并启动定时器

启动的是.timer文件,而不是.service文件

因为配套的service文件有timer文件启动

执行命令systemctl list-timers列出定时器

at

注意


设定或执行计划任务之前最好看一下服务器时间是否正常

at命令(一次性计划任务)
at命令是一次性执行命令,也就是说这个命令设置的计划任务就执行一次就消亡了,at命令是由atd服务提供的,atd.service服务是开机自启守护进程服务。

at命令用于在指定时间执行命令。它能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight,noon,teatime来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。
now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量等。 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。

at命令语法格式:

at  HH:MM yyyy-mm-dd
> command
> Ctrl+D

at  HH:MM yyyy-mm-dd -f filename                            #文件必须是可执行权限,而且应该写绝对路径

示例:

[root@master ~]# at 14:01 2023-10-7 -f /root/at.sh            #文件必须是可执行权限,而且应该写绝对路径
job 8 at Thu Oct  7 14:01:00 2023
[root@master ~]# atq
8    Thu Oct  7 14:01:00 2023 a root


格式一是指定时间后按回车键,再输入命令,然后按Ctrl+D来提交任务,第二个格式是通过参数-f来指定执行的脚本文件,脚本文件必须是能使用sh来执行的具有可执行权限的文件,而且应该写绝对路径。

atq                            #查询当前设置的at任务列表,等价于at -l
at    -l                        #查询当前设置的at任务列表,等价于atq
atrm  n                     #删除指定任务编号的at任务,同at -d n命令,编号通过atq或at -l就能查得到
at -d  n                    #删除指定任务编号的at任务,同atrm n命令,编号通过atq或at -l就能查得到
at -c n                        #查看指定编号的任务的具体内容


at计划任务文件位置
默认目录:/var/spool/at/
每创建一个at计划任务默认就会在/var/spool/at/目录里创建一个文件,文件以a开头的,当任务执行完毕后,文件也随之消失。

crontab命令(周期性计划任务)

命令格式:crontab 选项

-l         列出指定用户的计划任务列表
-e         编辑指定用户的计划任务列表
-u        指定用户名,如果不指定,则默认当前用户
-r        删除指定用户的计划任务


通常,我们会使用crontab -e 进入脚本编辑模式来编辑计划任务,如下:

[root@Centos8 ~]# crontab -e 


这样就进入了计划任务编辑页面,这和vim一样的,编辑计划任务是有一定格式的,如下 讲解。

计划任务的编辑语法格式
语法格式:

分     时     日     月     周     需要执行的命令


取址范围:

分:0-59
时:0-23
日:1-31
月:1-12
周:0-7,其中0或7都可以表示星期天
4个符号:星号*   中杠行线 -     斜杠/     逗号,


* 星号表示取址范围中的每一个数字,如表示0-23小时中的每个小时则就用星号表示
-横杆代表连续区间表达式,如1到7可以表示:1-7
/斜杠表示每间隔多少个,如任务每隔五分钟执行一次,则可以在分的位置写:*/5
,英文的道号表示多个取值,如想在2点,3点,4点执行则可以在时的位置这样写:2,3,4


计划任务演示示例:


计划任务1:每月1、10、22日的4:45重启httpd服务
45  4   1,10,22   *   *    /usr/bin/systemctl restart httpd

计划任务2:每周六,周日的1:10分重启httpd服务
10  1   *    *  6,0    /usr/bin/systemctl restart httpd

计划任务3:每天18:00指23:00之间每隔30分钟重启httpd服务
*/30   18-23  *  *  *  /usr/bin/systemctl restart httpd


注意事项:

1、crontab -e 进入脚本编辑,一行就表示一个计划任务,需要多少个计划任务就写多少行。
2、命令必须使用绝对路径来表示, 使用which 命令 或  whereis 命令  来定位命令的绝对路径

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值