一个timer(定时器)的单元类型,用来定时触发用户定义的操作。要使用timer的定时器,关键是要创建一个定时器单元文件和一个配套的服务单元文件,然后启动这些单元文件。
定时器类型:
- 单调定时器:即从一个时间点过一段时间后激活的定时任务
- 实时定时器:通过日历事件激活定时任务。
匹配单元文件:
每个.timer文件所在目录都要有一个匹配的.service文件。 .timer文件用于激活并控制.service文件。
创建单调定时器
- (一)编写任务脚本
- (二)编写一个配套服务单元文件
- (三)编写一个定时器单元文件
- (四)测试
- (五)Timer 单元文件
单调定时器适合按照相对时间的计划任务管理,这里以一个定期备份任务为例,要求开机(系统启动)后每隔3秒执行一次。
与自定义系统服务——创建Shell脚本设置为systemd系统服务实例操作类似多了一个timer文件,可以对比一起操作。
(一)编写任务脚本
这里是个简单的时间写入日志文件的脚本。
[root@localhost ~]# cat system.sh
#############################
#DESCRIPTION:将日期写入日志文件
#AUTHOR:Ley
#CREATED: 4/3/2024 10:40
#############################
#!/bin/bash
echo `date` >> /root/system.txt
[root@localhost ~]# chmod +x system.sh ##增加可执行权限
[root@localhost ~]# . system.sh ##执行
[root@localhost ~]# cat system.txt ##查看日志文件,脚本执行成功
Wed Apr 3 10:48:55 AM CST 2024
(二)编写一个配套服务单元文件
可以将其命名为boot_backup.service,保存在/etc/systemd/system目录中。
[root@localhost ~]# cd /etc/systemd/system
[root@localhost system]# cat boot_backup.service
[Unit]
Description=Backup boot
[Service]
ExecStart=bash /root/system.sh ##添加可执行脚本
Type=simple
(三)编写一个定时器单元文件
可将其命名为boot_backup.timer,保存在/etc/systemd/system目录中。
[root@localhost system]# cat boot_backup.timer
[Unit]
Dsecription=Run boot weekly and on boot
[Timer]
OnUnitActiveSec=3s
[Install]
WantedBy=multi-user.target
(四)测试
[root@localhost system]# systemctl daemon-reload
[root@localhost system]# systemctl start boot_backup.timer
[root@localhost system]# systemctl status boot_backup.timer
● boot_backup.timer
Loaded: loaded (/etc/systemd/system/boot_backup.timer; enabled; vendor pre>
Active: active (elapsed) since Wed 2024-04-03 11:14:16 CST; 4s ago
Until: Wed 2024-04-03 11:14:16 CST; 4s ago
Trigger: n/a
Triggers: ● boot_backup.service
Apr 03 11:14:16 localhost.localdomain systemd[1]: Started boot_backup.timer.
[4]+ Stopped systemctl status boot_backup.timer
- tail -f filename
说明:监视filename文件的尾部内容(默认10行,相当于增加参数 -n 10),刷新显示在屏幕上。退出,按下CTRL+C。
[root@localhost ~]# tail -f system.txt
Wed Apr 3 11:16:48 AM CST 2024
Wed Apr 3 11:16:50 AM CST 2024
Wed Apr 3 11:17:17 AM CST 2024
Wed Apr 3 11:18:17 AM CST 2024
Wed Apr 3 11:18:41 AM CST 2024
Wed Apr 3 11:18:45 AM CST 2024
Wed Apr 3 11:19:17 AM CST 2024
Wed Apr 3 11:20:17 AM CST 2024
Wed Apr 3 11:21:17 AM CST 2024
Wed Apr 3 11:22:17 AM CST 2024
错误: 开始每3s只执行了一次,后面就是每分钟执行一次了!!!
说明.timer定时器单元文件没设置好。
(五)Timer 单元文件
[Timer]部分定制定时器。Systemd 提供以下一些字段。
OnActiveSec:定时器生效后,多少时间开始执行任务
OnBootSec:系统启动后,多少时间开始执行任务
OnStartupSec:Systemd 进程启动后,多少时间开始执行任务
OnUnitActiveSec:该单元上次执行后,等多少时间再次执行
OnUnitInactiveSec: 定时器上次关闭后多少时间,再次执行
OnCalendar:基于绝对时间,而不是相对时间执行
AccuracySec:如果因为各种原因,任务必须推迟执行,推迟的最大秒数,默认是60秒
Unit:真正要执行的任务,默认是同名的带有.service后缀的单元
Persistent:如果设置了该字段,即使定时器到时没有启动,也会自动执行相应的单元
WakeSystem:如果系统休眠,是否自动唤醒系统
看到AccuracySec字段:任务默认推迟时间是60s,而任务必须有推迟时间。如果不设置那么在执行一次后,系统无法立即反应过3s执行,那么采用默认推迟时间60s。因此我们要设置其为1us(微秒)、1ms(毫秒)
[root@localhost system]# cat boot_backup.timer
[Unit]
Dsecription=Run boot weekly and on boot
[Timer]
AccuracySec=1us
OnUnitActiveSec=3s
[Install]
WantedBy=multi-user.target
修改完.timer文件,重新执行如下命令:
[root@localhost system]# systemctl daemon-reload
[root@localhost system]# systemctl restart boot_backup.timer
[root@localhost system]# systemctl status boot_backup.timer
查看日志:每3s执行一次,成功!!!
[root@localhost system]# tail -f /root/system.txt
Wed Apr 3 11:29:08 AM CST 2024
Wed Apr 3 11:29:13 AM CST 2024
Wed Apr 3 11:29:16 AM CST 2024
Wed Apr 3 11:29:19 AM CST 2024
Wed Apr 3 11:29:22 AM CST 2024
Wed Apr 3 11:29:25 AM CST 2024
Wed Apr 3 11:29:28 AM CST 2024
Wed Apr 3 11:29:31 AM CST 2024
Wed Apr 3 11:29:34 AM CST 2024
Ctrl+c 退出!!!
[参考文章]
Systemd 定时器教程