Linux定时任务设置

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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值