CRONTAB命令学习

CRONTAB

相当于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命令

crontab的基本组成:

  • 系统服务: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(分钟/小时)执行一次命令

crontab工具

[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)

crontab配置文件

/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:这样会覆盖只前的计划任务

crontab的日志

日志位置:/var/log/cron

每次执行crontab中的命令,都会通过邮件方式发送给对应用户的mail文件里(/var/spool/mail/username)

crontab常见错误

  • 环境变量

在.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引申

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次。


你可能感兴趣的:(杂)