crontab定时任务全攻略

crontab定时任务全攻略

一、crontab是什么?

crontab 是 Linux 自带的定时任务管理器。就是在指定时间,自动执行你写好的命令或脚本,解放运维人员的双手,不用手动值守就能完成各类定时操作。

二、5 个最常用命令
1
2
3
4
5
6
7
8
9
10
#查看当前用户的定时任务
crontab -l
#编辑定时任务(最常用)
crontab -e
#删除所有定时任务(慎用!)
crontab -r
#查看 crond 服务状态
systemctl status crond
#重启服务(修改配置不生效时用)
systemctl restart crond

当然我们主要使用的是crontab -e 编辑,crontab -l 查看这两个命令。

三、时间格式

1
* *  *  *  *  命令/脚本分 时 日 月 周

简单说明:

  • * 代表每一个单位(每分钟、每时、每天…)
  • */5 每隔 5 个单位
  • 1,3,5 第1、第3、第5
  • 1-5 范围 1~5

四、高频示例(脚本)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#每分钟执行一次
* * * * * /root/test.sh
#每5分钟执行一次(高频执行)
*/5 * * * * /root/test.sh
#每天凌晨 2 点执行
0 2 * * * /root/backup.sh
#每晚 20:30 执行
30 20 * * * /root/job.sh
#每周日凌晨 3 点
0 3 * * 0 /root/week_backup.sh
#每月1号凌晨1点
0 1 1 * * /root/month_job.sh
#工作日(周一到周五)早上7点
0 7 * * 1-5 /root/work.sh

五、高频示例(命令)

简单的命令可以不用写脚本,crontab 可直接执行命令!举个例子:为防止日志无限制增加,我们需要每天定时删除7天前的日志。

1
find /data -name "*.log" -mtime +7 -delete -mtime +7 #7天以前的文件-delete #直接删除(安全高效)

正式加定时任务前,先手动执行一遍,看看会删哪些,以确保数据安全。

1
find /data -name "*.log" -mtime +7

3、可直接放进 crontab 的删日志任务

每天凌晨2点清理 /data 下7天前日志

1
0 2 * * * find /data -name "*.log" -mtime +7 -delete

六、高频示例(特殊用途)

每月最后一天执行脚本

1
2
#每月最后一天 23:59 执行(通过日期判断实现)
59 23 28-31 * * [ $(date +%d -d tomorrow) = 01 ] && /clear.sh

确保同一时间只有一个脚本运行(flock)

1
2
#加锁执行,脚本未结束则新任务直接退出
0 2 * * * flock -n /data/backup.lock /backup.sh

不规则时间(如90分钟,用两组定时任务)

1
2
3
4
#规则1:0、3、6、9、12、15、18、21 点整执行
0 0-23/3 * * * /你的脚本路径.sh
#规则2:1、4、7、10、13、16、19、22 点 30 分执行
30 1-22/3 * * * /你的脚本路径.sh

两个规则组合后,执行时间就是:0:00 → 1:30 → 3:00 → 4:30 → 6:00 → …,刚好间隔 90 分钟。

七、日常注意事项

1.脚本没有执行权限

1
chmod +x test.sh  #增加脚本执行权限 

2.命令/路径不写绝对路径

不要写 sh test.sh,要写 ``/bin/sh /root/test.sh

3.环境配置

crontab 环境极简,脚本里尽量用全路径。

\**\*\*\*\*\*\*八、定时任务不执行?\*\*\*\*\*\**\*

\**\*\*\*\* \*\*\*\*\**

  • 看任务是否存在:crontab -l

  • 看服务是否运行:systemctl status crond

  • 看日志定位问题:

    tail -f /var/log/cron

  • crontab没有当前时间的概念,每隔一小时执行一次,应该这样写

    1
    0 */2 * * * #每2小时的整点执行一次 
    1
    * */2 * * * #每两个小时间隔内,每分钟执行一次  ,这个很多书上都是错误的。