Systemd中的timer
systemd
对比 crond
的优势
- 由于所有的 systemd 的服务产生的信息都会被记录 (log),因此比 crond 在 debug 上面要更清楚方便的多;
- 各项 timer 的工作可以跟 systemd 的服务相结合;
- 各项 timer 的工作可以跟 control group (cgroup,用来取代 /etc/secure/limit.conf 的功能) 结合,来限制该工作的资源利用
- 相对于 crond 最小的单位到分, systemd 是可以到秒甚至是毫秒的单位
systemd实现定时备份需要创建两个文件,service与timer,创建的位置/usr/lib/systemd/system
以下通过一个案例介绍systemd的使用:
第一步:创建一个shell脚本:> 段落引用
vim mail.sh
# 内容,建议使用绝对路径,否则后面执行msg.txt会生成在根目录
#!/bin/bash
echo `date` >> msg.txt
#添加执行权限
chmod +x mail.sh
验证:执行bash mail.sh会在指定目录输出msg.txt
第二步:创建Service单元.进入/usr/lib/systemd/system/
目录中,创建mytimer.service文件
vim mytimer.service
#写入内容
[Unit]
Description=mytimer service
#<path>要改成对应路径
[Service]
ExecStart=/bin/bash <path>/mail.sh
# 这里可以不添加[Install]区块,因为该Service是为Timer单元服务的
验证:使用systemctl start mytimer.service执行,可以看到msg.txt文件新增了一行记录
第三步:/usr/lib/systemd/system/
目录中创建Timer单元,创建mytimer.timer文件
vim mytimer.timer
#内容如下
[Unit]
Description=run mail.sh every 10s
[Timer]
OnUnitActiveSec=10s
Unit=mytimer.service
[Install]
WantedBy=multi-user.target
第四步:启动Timer单元.
systemctl daemon-reload
systemctl enable mytimer.timer
systemctl start mytimer.timer
#查看timer运行状态
systemctl status mytimer.timer
tail -f msg.txt # 查看打印情况,每10s会打印一次,我的实测 时间间隔不是很精确哈
journalctl -f -u mytimer.timer # 查看定时器执行失败的日志,定时器成功则需要查看服务的日志
[Timer]区块属性详情
OnActiveSec:定时器生效后,多少时间开始执行任务
OnBootSec:系统启动后,多少时间开始执行任务
OnStartupSec:Systemd 进程启动后,多少时间开始执行任务
OnUnitActiveSec:该单元上次执行后,等多少时间再次执行
OnUnitInactiveSec: 定时器上次关闭后多少时间,再次执行
OnCalendar:基于绝对时间,而不是相对时间执行
AccuracySec:如果因为各种原因,任务必须推迟执行,推迟的最大秒数,默认是60秒
Unit:真正要执行的任务,默认是同名的带有.service后缀的单元
Persistent:如果设置了该字段,即使定时器到时没有启动,也会自动执行相应的单元
WakeSystem:如果系统休眠,是否自动唤醒系统
删除定时器
systemctl disable mytimer.timer #关闭开机启动(即删除目录链接)
systemctl stop mytimer.timer # 关闭单元
systemctl stop mytimer.service
#之后删除timer 和Service文件
systemctl daemon-reload # 重新加载配置
定时任务例子
案例一:每天十点半备份(验证通过
)
#注意此处用的字段为OnCalendar
[Unit]
Description=每天十点半备份
[Timer]
OnCalendar=*-*-* 10:30:00
Unit=mytimer.service
[Install]
WantedBy=multi-user.target
案例二:每隔10分钟执行(验证通过
)
[Unit]
Description=每隔10分钟执行
[Timer]
OnUnitActiveSec=10min
Unit=mytimer.service
[Install]
WantedBy=multi-user.target
# 只要这样设定就够了!储存离开吧!
案例三:每周一 1:30执行(验证通过
)
[Unit]
Description=每周一1:30:00执行
[Timer]
OnCalendar=Mon *-*-* 01:30:00
Unit=mytimer.service
[Install]
WantedBy=multi-user.target
# 只要这样设定就够了!储存离开吧!
一种简单的定时任务工具crontab
(不推荐使用)
#查看当前定时任务
crontab -l
#删除当前定时任务
crontab -r
#修改当前定时任务
crontab -e
#服务基本命令
systemctl start crond #启动服务
systemctl stop crond #停止服务
systemctl restart crond #重启服务
systemctl reload crond #重载配置文件(修改配置定时任务后记得执行)
systemctl status crond #?查看状态
需求:每天的6点42分,运行一次spmake脚本
42 6 * * * /home/luzj/bin/spmake
便捷格式
0 12 * * * xx.sh //你要执行的shell脚本或其它linux命令
#分 时 日 月 周 |《==============命令行=======================》
案例
##每月每天凌晨3点30分和中午12点20分执行test.sh脚本
30 3,12 * * * /home/test.sh
##每月每天每隔6小时的每30分钟执行test.sh脚本
30 */6 * * * /home/test.sh
##每月每天早上8点到下午18点每隔2小时的每30分钟执行test.sh脚本
30 8-18/2 * * * /etc/init.d/network restart
##每月每天晚上21点30分执行test.sh脚本
30 21 * * * /etc/init.d/network restart
##每月1号、10号、22号凌晨4点45分执行test.sh脚本
45 4 1,10,22 * * /etc/init.d/network restart
##8月份周一、周日凌晨1点10分执行test.sh脚本
10 1 * 8 6,0 /etc/init.d/network restart
##每月每天每小时整点执行test.sh脚本
00 */1 * * * /etc/init.d/network restart