linux 中的计划任务之crontab

原创
2018/10/05 01:42
阅读数 1W

linux中的计划任务crontab

crontab:可以从定时重复工作中解脱出来

工作中遇到的困难

  • 每分钟需要执行一个程序检查系统运行状态
  • 每天凌晨需要对过去一天的业务数据进行统计
  • 每个星期需要把日志文件备份
  • 每个月需要把数据库进行备份

crontab 简介

  • 用于设置周期性被执行的任务工具。
  • 被周期性执行的任务我们称为Cron job
  • 周期性执行的任务列表称为Cron Table

crontab 实践内容简介

  • 相关工具
  • 安装并检查crontab服务
  • crontab的基本组成
  • crontab的配置文件格式
  • crontab工具的使用
  • crontab 的日志
  • crontab 常见的错误

检查cron服务

  • 检查crontab工具是否安装:crontab -l
  • 检查crontab服务是否启动:service crond status

安装cron

  • yum install -y vixie-cron
  • yum install crontabs

案例

[root@xuexi-001 ~]# crontab -e
*/1 * * * * date >> /tmp/log.txt
# 每分钟都打印当前时间到log.txt 文件中
[root@xuexi-001 ~]# tail -f /tmp/log.txt 
2018年 10月 05日 星期五 00:00:01 CST
2018年 10月 05日 星期五 00:01:01 CST
2018年 10月 05日 星期五 00:02:01 CST
# tail -f 显示文件的最后几行 ,tail -2 显示文件的最后两行

crontab 基本组成

  • crond 服务 --系统服务
  • 配置文件 --以文件方式设置定时任务
  • 配置工具 -- 用于调整定时任务

crontab 配置文件格式

  • * * * * * COMMAND
  • 第一个 * :分钟 0-59
  • 第二个 * :小时 0-23
  • 第三个 * :日期 1-31
  • 第四个 * :月份 1-12
  • 第五个 * :星期 0-7(0或者7代表星期天)

案例

  • 每晚的21:30重启apache
30 21 * * * service httpd restart
  • 每月的1、10、22日的4:45重启apache
45 4 1,10,22 * * service httpd restart
  • 每月的1到10日的4:45重启apache
45 4 1-10 * * service httpd restart
  • 每隔两分钟重启apache
*/2 * * * * service httpd restart # 偶数分钟
1-59/2 * * * * service httpd restart # 奇数分钟
  • 晚上11点到早上7点之间,每隔一小时重启apache
0 23-7/1 * * * service httpd restart
  • 每天18:00到23:00之间每隔30分钟重启apahce
0,30 18-23 * * * service httpd restart
0-59/30 18-23 * * * service httpd restart

小结

  • * 表示任何时候都匹配
  • 可用“A,B,C” 表示A或者B或者C时执行命令
  • 可用“A-B”表示A-B之间时执行命令
  • 可用“*/A” 表示A分钟(小时等)执行一次命令

crontab工具的使用

crontab 选项:

  • -u: define user
  • -e: edit user's crontab
  • -l: list user's crontab
  • -r: delete user's crontab

案例

1、给root 用户添加计划任务:每隔两分钟(奇数分钟)打印 “JISHU**********”

[root@xuexi-001 ~]# crontab -e
1-59/2 * * * * echo "JISHU***********************"

2、添加普通用户 crontester 并且添加计划任务:每隔两分钟(偶数分钟)打印“EVEN**************”

[root@xuexi-001 ~]# useradd crontester
[root@xuexi-001 ~]# crontab -e -u crontester 
[root@xuexi-001 ~]# crontab -l -u crontester
0-58/2 * * * * echo "EVEN ************"

查看日志

[root@xuexi-001 ~]# tail -f /var/log/cron
Oct  5 00:51:01 xuexi-001 CROND[1906]: (root) CMD (echo "JISHU***********************")
Oct  5 00:52:01 xuexi-001 CROND[1911]: (crontester) CMD (echo "EVEN ************")

crontab 配置文件

  • 全局(系统)配置文件
  • /etc/crontab
  • 注意格式

crontab 日志

  • /var/log/cron 文件保存着cron的任务执行记录
[root@xuexi-001 ~]# cd /var/log/
您在 /var/spool/mail/root 中有新邮件
[root@xuexi-001 log]# ls cron*
cron  cron-20180611  cron-20180926  cron-20181001
[root@xuexi-001 log]# ls -l cron*
-rw-------  1 root root 23564 10月  5 01:10 cron
-rw-------. 1 root root 10917 6月  11 21:08 cron-20180611
-rw-------. 1 root root 11543 9月  26 20:13 cron-20180926
-rw-------  1 root root  4043 10月  1 13:22 cron-20181001
[root@xuexi-001 log]# tail -f cron
Oct  5 01:04:01 xuexi-001 CROND[2001]: (crontester) CMD (echo "EVEN ************")
Oct  5 01:04:49 xuexi-001 crontab[2005]: (root) LIST (root)
Oct  5 01:04:49 xuexi-001 crontab[2005]: PAM pam_end: NULL pam handle passed
Oct  5 01:05:01 xuexi-001 CROND[2007]: (root) CMD (echo "JISHU***********************")
Oct  5 01:06:01 xuexi-001 CROND[2014]: (crontester) CMD (echo "EVEN ************")
Oct  5 01:07:01 xuexi-001 CROND[2020]: (root) CMD (echo "JISHU***********************")
Oct  5 01:08:01 xuexi-001 CROND[2026]: (crontester) CMD (echo "EVEN ************")
Oct  5 01:09:01 xuexi-001 CROND[2032]: (root) CMD (echo "JISHU***********************")

crontab 常见错误

  • 环境变量
  • 命令行双引号中使用%时,未加反斜线\
  • 第三和第五个域之间执行的是“或”操作
  • 分钟设置误用

  • 第三和第五个域之间执行的是“或”操作

案例

  • 四月的第一个星期日早晨1时59分钟运行a.sh
59 1 1-7 4 * test`date + \%w` -eq 0 && /root/a.sh 
  • 分钟设置误用

案例

  • 两小时运行一次
错误示例:
* 0,2,4,6,8,10,12,14,16,18,20,22 * * * date

正确示例:
0 */2 * * * date

说明

在使用分钟的时候如果使用的分钟时使用 * 那么就是每两个小时的每分钟都会执行。正确的应该设置为 0,还有就是在使用分钟设置时,要注意分钟的约束,比如1-10/2,先满足1-10之间的每两分钟也就是1,3,5,7,9的时候执行,在11分钟的时候就不执行了。

展开阅读全文
打赏
0
12 收藏
分享
加载中
更多评论
打赏
0 评论
12 收藏
0
分享
返回顶部
顶部