crontab命令
crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件。而crontab命令是用户用来设置定时规则的命令。通过crontab可以在固定的间隔时间执行指定的系统指令或script脚本。
用法:
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
- -e编辑用户的crontab
- -l查看用户的crontab
- -r删除用户的crontab
crontab [-e | -l]实际上就是操作/var/spool/cron/当前用户 这样的文件。
通过crontab查看或编辑的定时任务规则默认放到/var/spool/cron/用户名文件 中。
定时任务文件
文件 | 说明 |
---|---|
/etc/cron.deny | 该文件中所列用户不允许使用crontab命令 |
/etc/cron.allow | 该文件中所列用户允许使用crontab命令,优先于/etc/cron.deny |
/var/spool/cron/ | 所有用户crontab配置文件默认都存放在此目录,文件名以用户名命名 |
两种使用方式:
在root下操作
[root@ianLinux ~]# crontab -u Ian -l
no crontab for Ian
[root@ianLinux ~]# crontab -u Ian -e
no crontab for Ian - using an empty one
#####
~
...
"/tmp/crontab.vEWEjl" 1L, 6C written
crontab: installing new crontab
[root@ianLinux ~]# crontab -u Ian -l
#####
[root@ianLinux ~]# cat /var/spool/cron/Ian
#####
也可以切换到Ian下进行操作:
[Ian@ianLinux ~]$ crontab -l
#####
[Ian@ianLinux ~]$ crontab -e
#####
#####
~
~
"/tmp/crontab.36iJyx" 2L, 12C written
crontab: installing new crontab
[Ian@ianLinux ~]$ crontab -l
#####
#####
但此时有个问题:
既然/var/spool/cron/Ian文件的属主是root,Ian是没有读写执行权限的。
那么/var/spool/cron/Ian是如何被修改的呢?
rws注意’s’,所以我们发现crontab有特权。
执行定时任务时crontab命令的使用格式
用户的定时任务规则一般分为6个段,空格来分隔。
系统的定时任务为/etc/crontab,分为7段,空格来分隔。
前五段为时间的设定段,第六段为所要执行的命令或脚本任务段。
用户定时任务格式举例:
01 * * * * cmd
cmd为要执行的命令或脚本。每列之间必须要有一个空格。
cat /etc/crontab
这是系统的定时任务格式。系统的和用户的前五个段是一样的。
分时日月周。
crontab语法格式中时间段的含义:
段 | 含义 | 取值范围 |
---|---|---|
第一段 | 分钟 | 00-59 |
第二段 | 小时 | 00-23 |
第三段 | 日 | 01-31 |
第四段 | 月份 | 01-12 |
第五段 | 周几 | 0-7(0和7都是星期日) |
crontab语法格式中特殊符号的含义:
符号 | 含义 |
---|---|
* | 表示任意时间,即“每”。00 23 * * * cmd 表示每月每周每日的23:00都执行cmd任务。 |
- | 表示一个时间范围。00 17-19 * * * cmd 表示每月每周每日的17,18,19点整点执行cmd任务。 |
, | 表示分隔时段。30 17,18,19 * * * cmd 表示每天17、18、19点30执行cmd任务。 |
/n | n表示数字,即每隔n单位时间。*/10 * * * * cmd表示每隔10分钟执行cmd任务。 |
实例:
①30 3,12 * * * /bin/sh /scripts/test.sh,此定时任务的意思是每天凌晨3:30和中午12:30执行/scripts/test.sh脚本。
②30 */6 * * * /bin/sh /scripts/test.sh,此时定时任务的意思每天每隔6个半小时执行/scripts/test.sh脚本。
③30 8-18/2 * * * /bin/sh /scripts/test.sh,此定时任务的意思是每天的上午8点到下午18点之间每隔2个半小时,执行/scripts/test.sh脚本。
④45 4 1,10,22 * * /application/apache/bin/apachectl graceful,此定时任务的意思是每个月的1、10、22日的凌晨4:45分重启apache。
⑤* 23,00-07/1 * * * /application/apache/bin/apachectl graceful
这个例子不表示晚上23点和上午0-7点之间每隔一小时重启apache。
它表示每分钟都执行任务,即晚上23点和上午0-7点之间每隔一小时的每分钟都重启apache。
定时任务的使用实例
例1:每分钟打印一次自己的名字全拼到“/data/log/自己的名字命名的文件”。
注意:
1、定时任务要加注释
2、结尾不要有>/dev/null 2>&1
3、/data/log目录必须要存在才能有结果
4、定时任务中的路径一定要是绝对路径
5、crond服务必须开启运行
例2:每周六、日上午9:00和下午14:00执行/data/scripts/Ian.sh。
要求:/data/scripts/Ian.sh脚本的功能是打印当天的日期格式为2016-09-12。
[root@ianLinux data]# mkdir /data/scripts/
[root@ianLinux data]# echo 'date +%F' >/data/scripts/Ian.sh
因为Ian.sh没有执行权限所以不能执行。
所以执行定时任务时,如果是执行脚本,在脚本前面带上/bin/sh命名,否则有可能因为忘了为脚本设定执行权限,从而无法完成任务。
[root@ianLinux data]# /bin/sh /data/scripts/Ian.sh
2016-09-12
书写定时任务的核心要领
1. 加必要注释
加了注释,就知道定时任务运行的是什么作业,以防以后作业混乱。
2. 执行shell脚本任务前加/bin/sh
/bin/sh /data/scripts/Ian.sh
执行定时任务时,如果是执行脚本,在脚本前面带上/bin/sh命名,否则有可能因为忘了为脚本设定执行权限,从而无法完成任务。
3. 定时任务命令或脚本结尾加>/dev/null 2>&1
00 09,14 * * 6,0 /bin/sh /data/scripts/Ian.sh >/dev/null 2>&1
定时任务每执行一次都会给管理员发邮件,会将cron执行脚本中的output和warning信息,都会以邮件的形式发送cron所有者。
如果邮件服务没开,就会把邮件放到邮件队列里去,实际就是放到/var/spool/clientmqueue邮件临时队列目录里去(CentOS6.X是/var/spool/postfix/maildrop)。如果定时任务规范结尾不加 >/dev/null 2>&1,定时任务每执行一次,就往里面填一个小文件,这就会很容易导致inode被用完。
4.定时任务命令或程序最好写到脚本里执行
[root@ianLinux data]# echo 'date +%F' >/data/scripts/Ian.sh
[root@ianLinux data]# cat /data/scripts/Ian.sh
date +%F
...
[root@ianLinux data]# crontab -l|tail -2
##cron job at 20160912 by Ian for...
00 09,14 * * 6,0 /bin/sh /data/scripts/Ian.sh >/dev/null 2>&1
5. 在指定用户下执行相关的定时任务
需要root权限执行的任务可以登录到root用户下设置,如果不需要root权限可以登录到普通用户下。
这里要特别注意不同用户的环境变量问题,如果是调用了系统环境变量/etc/profile,最好在程序脚本中将用到的环境变量重新export下。
6. 生产任务程序不要随意打印输出信息
在调试好脚本程序后,应尽量把DEBUG及命令输出的内容信息屏蔽掉,如果确实需要输出日志,可定向到日志文件里,避免产生系统垃圾。
7. 定时任务执行的脚本要规范路径
00 09,14 * * 6,0 /bin/sh /data/scripts/Ian.sh >/dev/null 2>&1
8. 配置定时任务规范操作过程
- 首先在命令行操作成功,然后复制成的命令到脚本里,在各个细小环节减少出错的机会。
- 然后测试脚本,测试成功后,复制脚本的规范路径到定时任务配置里。
- 先在测试环境下测试,然后正式环境规范部署。