目录
背景:
定时器是一种用来在预定的时间间隔内执行特定任务的工具。在编程中,定时器通常用来执行周期性的任务或者延时执行某个任务。在不同的编程语言和平台中,定时器的实现方式可能会有所不同。一般来说,可以使用内置的定时器类或者函数来创建和管理定时器。
创建timer单调定时器:
单调定时器适合按照相对时间的计划任务管理,这里以一个定期备份任务为例,要求开机(系统启动)后每隔3秒执行一次。
1.编写脚本:
先创建一个文件
vim time
编写文件内容
#############################
#DESCRIPTION:将日期写入日志文件
#AUTHOR:wei
#CREATED: 2024/4/7/ 11:04
#############################
#! /bin/bash
echo `date` >> /root/systime.txt
还应授予可执行权限
chmod +x time
运行该脚本,查看是否有问题
没有问题!那接着下面走
2.编写一个单元文件
当您在 Red Hat 系统上创建定时器时,您通常会使用 timer_create
函数。这个函数允许您创建一个新的定时器对象,并指定定时器的行为
cd /etc/systemd/system/
vim time.timer
将其命名为time.timer,保存在/etc/systemd/system目录中,内容如下:
[Unit]
Description=Run time weekly and on boot
[Timer]
OnUnitActiveSec=3s
[Install]
WantedBy=mulyi-user.target
3.编写一个配套的服务单元文件
ExecStart
:systemctl start
所要执行的命令ExecStop
:systemctl stop
所要执行的命令ExecReload
:systemctl reload
所要执行的命令ExecStartPre
:ExecStart
之前自动执行的命令ExecStartPost
:ExecStart
之后自动执行的命令ExecStopPost
:ExecStop
之后自动执行的命令
vim time.service
将其命名为time.service,保存在/etc/systemd/system目录中,内容如下:
[Unit]
Description=Backup time
[Service]
Type=simple
ExecStart=bash /root/time
4.测试该定时器
由于创建新的单元文件,
systemctl daemon-reload
分别执行一下命令是新建的定时器能开机启动,并启动定时器
systemctl enable time.timer
systemctl start time.timer
启动的是.timer文件而不是.service文件,因为配套的service文件由timer文件启动
使用
tail -f /root/systime.txt
说明:监视filename文件的尾部内容(默认10行,相当于增加参数 -n 10),刷新显示在屏幕上。退出,按下CTRL+C。
进行监视发现
出现如图的错误:一定是timer单元定时器没弄好
查看百度:
OnActiveSec
:定时器生效后,多少时间开始执行任务OnBootSec
:系统启动后,多少时间开始执行任务OnStartupSec
:Systemd 进程启动后,多少时间开始执行任务OnUnitActiveSec
:该单元上次执行后,等多少时间再次执行OnUnitInactiveSec
: 定时器上次关闭后多少时间,再次执行OnCalendar
:基于绝对时间,而不是相对时间执行AccuracySec
:如果因为各种原因,任务必须推迟执行,推迟的最大秒数,默认是60秒Unit
:真正要执行的任务,默认是同名的带有.service
后缀的单元Persistent
:如果设置了该字段,即使定时器到时没有启动,也会自动执行相应的单元WakeSystem
:如果系统休眠,是否自动唤醒系统
看到系统会延迟执行且是60秒,这与我们的问题相同,所以我们把推迟的秒数设置为1um(微秒)或1ms(毫秒)
所以我们将代码修改为
[Unit]
Description=Run time weekly and on boot
[Timer]
AccuracySec=1us
OnUnitActiveSec=3s
[Install]
WantedBy=mulyi-user.target
重新执行一遍命令:
完成!
总结:
定时器类型:
- 单调定时器:即从一个时间点过一段时间后激活的定时任务
- 实时定时器:通过日历事件激活定时任务。
我们用的时单调计时器,我们所遇到的问题大部分来自.timer文件中的所以我们把下面这个表掌握就行了。
OnActiveSec
:定时器生效后,多少时间开始执行任务OnBootSec
:系统启动后,多少时间开始执行任务OnStartupSec
:Systemd 进程启动后,多少时间开始执行任务OnUnitActiveSec
:该单元上次执行后,等多少时间再次执行OnUnitInactiveSec
: 定时器上次关闭后多少时间,再次执行OnCalendar
:基于绝对时间,而不是相对时间执行AccuracySec
:如果因为各种原因,任务必须推迟执行,推迟的最大秒数,默认是60秒Unit
:真正要执行的任务,默认是同名的带有.service
后缀的单元Persistent
:如果设置了该字段,即使定时器到时没有启动,也会自动执行相应的单元WakeSystem
:如果系统休眠,是否自动唤醒系统