相当于Windows中的计划任务
crontab出现的原因:工作中遇到的困难,如每分钟需要执行一个程序检查系统运行状态,或者每个星期需要备份日志文件等,于时出现了crontab。
crontab是一个用于设置周期性被执行的任务的工具。
在介绍crontab之前,先介绍两个概念,cron分为两部分:
cron job:被周期执行的任务
corn table:周期性执行的任务列表 ,它的每一行都是一个cron job
检查是否安装crontab,是否运行
[root@raid ~]# crontab -l no crontab for root [root@raid ~]# /etc/init.d/crond status crond (pid 1104) is running...
如果没有,需要下载安装cron
[root@raid ~]# yum list all |grep crontab This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. crontabs.noarch 1.10-33.el6 @anaconda-RedHatEnterpriseLinux-201311111358.x86_64/6.5
corntab的一个小例子:
小提示:crontabe -e
操作的文件是 /var/spool/cron/username
//当前用户是谁,就操作对应用户名文件
[root@raid ~]# crontab -e //打开一个文件,写入以行计划 */1 * * * * date >> /tmp/date.txt //查看写入的计划: [root@raid ~]# crontab -l */1 * * * * data >> /tmp/date.txt
查看是否按计划执行date命令,并且将结果重定向到/tmp/date.txt中
[root@raid ~]# cat /tmp/date.txt Sat Apr 7 05:27:01 EDT 2018 Sat Apr 7 05:28:01 EDT 2018 //可以看到,每分钟都会执行依次date命令
系统服务:crond
,每分钟都会从配置文件中刷新定时任务;并且执行计划任务。
配置文件:以配置文件的方式设定定时任务。
配置工具:crontab
,用于调整定时任务。
crontab的配置文件格式:
* * * * * COMMAND
第一个*:分钟0~59
第二个*:小时0~23
第三个*:日期1~31
第四个*:月份1~12
第五个*:星期0~7;注意0和7都表示星期天。
COMMAND:执行的具体命令
如:每晚的21:30重启apache
30 21 * * * /etc/init.d/httpd restart
每月1,10,20号的4:45重启apache服务
45 4 1,10,20 * * /etc/init.d/httpd restart
每月1到10号的3:23重启apache服务
23 3 1-10 * * /etc/init.d/httpd restart
每隔两分钟重启apache服务
*/2 * * * * /etc/init.d/httpd restart1-59/2 * * * * /etc/init.d/httpd restart //每奇数分钟重启apache
晚上11点到早上七点之间,每隔一小时重启一次apache
0 23-7/1 * * * /etc/init.d/httpd restart
每天18:00到23:00之间每隔30分钟重启apache
0,30 18-23 * * * /etc/init.d/httpd restart
0-59/30 18-23 * * * /etc/init.d/httpd restart
总结:
“ * ”表示任何时候都匹配
可以用 “ A,B,C ” 表示A或者B或者C时执行命令
可以用 “ A-B ” 表示A到B之间的时间执行命令
可以用 “ */A ” 表示每A(分钟/小时)执行一次命令
[root@raid ~]# crontab --help usage: crontab [-u user] file crontab [-u user] [ -e | -l | -r ] (default operation is replace, per 1003.2) -e (edit user's crontab) -l (list user's crontab) -r (delete user's crontab) -i (prompt before deleting user's crontab) -s (selinux context) //-u:分用户的计划任务配置
crontab可以指定用户,一般来说crontab -e执行的是当前环境用户的计划任务
[root@raid ~]# crontab -l -u fsx 0-58/2 * * * * echo "EVEN******" [root@raid ~]# crontab -l */1 * * * * date >> /tmp/date.txt 1-59/2 * * * * echo "233333" //root用户添加了两个crontab任务,fsx用户添加了一条crontab任务
查看日志:
[root@raid ~]# tail -f /var/log/cron Apr 7 05:53:01 raid CROND[1376]: (root) CMD (date >> /tmp/date.txt) Apr 7 05:53:01 raid CROND[1377]: (root) CMD (echo "233333") Apr 7 05:53:41 raid crontab[1390]: (root) BEGIN EDIT (fsx) Apr 7 05:54:01 raid CROND[1393]: (root) CMD (date >> /tmp/date.txt) Apr 7 05:54:04 raid crontab[1390]: (root) REPLACE (fsx) Apr 7 05:54:04 raid crontab[1390]: (root) END EDIT (fsx) Apr 7 05:54:11 raid crontab[1395]: (root) LIST (fsx) Apr 7 05:54:14 raid crontab[1396]: (root) LIST (root) Apr 7 05:55:02 raid CROND[1399]: (root) CMD (date >> /tmp/date.txt) Apr 7 05:55:02 raid CROND[1400]: (root) CMD (echo "233333") Apr 7 05:56:01 raid CROND[1411]: (root) CMD (date >> /tmp/date.txt) Apr 7 05:56:01 raid CROND[1410]: (fsx) CMD (echo "EVEN******") Apr 7 05:56:01 raid crontab[1416]: (root) BEGIN EDIT (fsx) Apr 7 05:56:03 raid crontab[1416]: (root) END EDIT (fsx)
/etc/crontab
全局配置,可以设置用户。
[root@raid ~]# cd /etc/ //查看有关crontab的所有配置文件 [root@raid etc]# ls cron* cron.deny crontab cron.d: 0hourly raid-check cron.daily: logrotate rhsmd cron.hourly: 0anacron cron.monthly: cron.weekly:
查看crontab的只配置文件 /etc/crontab
文件
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed */1 * * * * root echo "fsx 23333" >> /tmp/fsx.txt //该配置文件时系统级别的,crontab -l 看不见
查看系统级别配置后日志记录:
[root@raid etc]# tail -f /var/log/cron Apr 7 06:01:01 raid run-parts(/etc/cron.hourly)[1473]: finished 0anacron Apr 7 06:01:01 raid anacron[1471]: Will run job `cron.daily' in 27 min. Apr 7 06:01:01 raid anacron[1471]: Will run job `cron.weekly' in 47 min. Apr 7 06:01:01 raid anacron[1471]: Will run job `cron.monthly' in 67 min. Apr 7 06:01:01 raid anacron[1471]: Jobs will be executed sequentially Apr 7 06:01:54 raid crontab[1474]: (root) LIST (root) Apr 7 06:02:01 raid crond[1104]: (*system*) RELOAD (/etc/crontab) Apr 7 06:02:01 raid CROND[1479]: (root) CMD (echo "fsx 23333" >> /tmp/fsx.txt) Apr 7 06:02:01 raid CROND[1478]: (root) CMD (date >> /tmp/date.txt) Apr 7 06:02:01 raid CROND[1480]: (fsx) CMD (echo "EVEN******")
提示:
crontab file
可以读取文件中的crontab配置,并写入/var/spool/cron/username
里里面
注意:crontab file
:这样会覆盖只前的计划任务
日志位置:/var/log/cron
每次执行crontab中的命令,都会通过邮件方式发送给对应用户的mail文件里(/var/spool/mail/username
)
环境变量
在.bash_profile设置的环境变量,并不可以被crontab配置文件识别
命令行中双引号中使用%时," \ "问题
第三和第五个域之间执行的是 “ 或 ” 操作
即:五个(*)域中,日期和星期是或的关系。
如:四月的第一个星期日早晨1时59分运行/root/a.sh
59 1 1-7 4 0 /root/a.sh
//四月一号到七号,周天,一点五十九
//因为三五域是或的关系,所以这个计划的逻辑解释是,死于一号到七号,或者四月的周天,一点五十九都是执行a.sh脚本
所以上面的表达式是错误的,要真正实现:
59 1 1-7 4 * test
date \+%w
-eq 0 && /root/a.sh//四月一号到七号,一点五十九都去执行后面命令,命令:如果
date +%w
(输出周几),== 0 (周天),则执行a.sh,但是在crontab中,date后面,必须有那个" \ "。这就是第二个常见的错误
分钟设置误用
两个小时运行一次:
正确设置:
0 */2 * * * COMMAND
错误设置:
* 0,2,4,6,8,10,12,14,16,18,20,22 * * * COMMAND
crontab中最小智能设置到每分钟执行一次命令,如果想在每半分钟执行一次命令如何做到?
可以通过shell脚本的sleep命令配合crontab完成
date && sleep 0.5s && date
即,执行date后,sleep0.5秒,再执行一次date
[root@raid ~]# crontab -e crontab: installing new crontab [root@raid ~]# crontab -l */1 * * * * date >> /mnt/date.log */1 * * * * sleep 30s; date >> /mnt/date.log //新增crontab任务,先设定每分钟执行一次date;再设置睡眠30秒执行一次date,即每30秒执行一次date命令
[root@raid ~]# tail -f /var/log/cron //查看日志 Apr 7 07:27:52 raid crontab[2351]: (root) BEGIN EDIT (root) Apr 7 07:27:59 raid crontab[2351]: (root) REPLACE (root) Apr 7 07:27:59 raid crontab[2351]: (root) END EDIT (root) Apr 7 07:28:01 raid crond[1104]: (root) RELOAD (/var/spool/cron/root) Apr 7 07:28:01 raid CROND[2355]: (fsx) CMD (echo "EVEN******") Apr 7 07:28:01 raid CROND[2356]: (root) CMD (date >> /mnt/date.log; sleep 30s; date >> /mnt/date.log ) Apr 7 07:29:01 raid CROND[2369]: (root) CMD (date >> /mnt/date.log; sleep 30s; date >> /mnt/date.log ) Apr 7 07:30:01 raid CROND[2375]: (fsx) CMD (echo "EVEN******") Apr 7 07:30:01 raid CROND[2376]: (root) CMD (date >> /mnt/date.log; sleep 30s; date >> /mnt/date.log ) Apr 7 07:31:01 raid CROND[2386]: (root) CMD (date >> /mnt/date.log; sleep 30s; date >> /mnt/date.log ) Apr 7 07:32:01 raid CROND[2392]: (fsx) CMD (echo "EVEN******") Apr 7 07:32:01 raid CROND[2393]: (root) CMD (date >> /mnt/date.log; sleep 30s; date >> /mnt/date.log ) Apr 7 07:33:01 raid CROND[2403]: (root) CMD (date >> /mnt/date.log; sleep 30s; date >> /mnt/date.log ) Apr 7 07:34:01 raid CROND[2409]: (fsx) CMD (echo "EVEN******") Apr 7 07:34:01 raid CROND[2410]: (root) CMD (date >> /mnt/date.log; sleep 30s;
[root@raid ~]# cd /mnt/ //查看执行结果,可以看到每30秒执行一次 [root@raid mnt]# tail -f date.log Sat Apr 7 07:28:31 EDT 2018 Sat Apr 7 07:29:01 EDT 2018 Sat Apr 7 07:29:31 EDT 2018 Sat Apr 7 07:30:01 EDT 2018 Sat Apr 7 07:30:31 EDT 2018 Sat Apr 7 07:31:01 EDT 2018 Sat Apr 7 07:31:31 EDT 2018 Sat Apr 7 07:32:01 EDT 2018 Sat Apr 7 07:32:31 EDT 2018 Sat Apr 7 07:33:01 EDT 2018 Sat Apr 7 07:33:31 EDT 2018 Sat Apr 7 07:34:01 EDT 2018 //如果是每10秒执行一次,需要sleep6次。