最新消息:阿啰哈,本人90后,目前单身,欢迎妹子们来撩!.(。→‿←。) 微信:frank01991

crontab,执行周期性任务

CentOS 林志斌 1011浏览
1、默认crond服务是安装了的,并且在2,3,4,5运行级别上自动启动
[[email protected] ~]# chkconfig --list | grep crond  
crond           0:off 1:off 2:on 3:on 4:on 5:on 6:off

2、目前,系统中的crond服务正在运行中
[[email protected] ~]# service --status-all | grep crond
crond (pid  4995) is running...

3、默认情况下,系统中的所有用户都可以使用crond服务
[[email protected] ~]# su - user1

查看当前用户所设置的crontab周期任务列表,当前这个用户没有任何crontab设置
[[email protected] ~]$ crontab -l
no crontab for user1

添加一条周期任务,每分钟都运行这条命令
[[email protected] ~]$ crontab -e
*/1 * * * * date >> ~/date.txt

特别注意前面5个字段的含意,它们代表的是在什么时间去执行这些任务:
代表意义 分钟 小时 日期 月份 命令
数字范围 0-59 0-23 1-31 1-12 0-7 呀就命令啊

比较有趣的是那个『周』喔!周的数字为 0 或 7 时,都代表『星期天』的意思!另外, 还有一些辅助的字符,大概有底下这些:

特殊字符 代表意义
*(星号) 代表任何时刻都接受的意思!举例来说,范例一内那个日、月、周都是 * , 就代表著『不论何月、何日的礼拜几的 12:00 都运行后续命令』的意思!
,(逗号) 代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是:

0 3,6 * * * command

时间参数还是有五栏,不过第二栏是 3,6 ,代表 3 与 6 都适用!

-(减号) 代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作:

20 8-12 * * * command

仔细看到第二栏变成 8-12 喔!代表 8,9,10,11,12 都适用的意思!

/n(斜线) 那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则:

*/5 * * * * command

很简单吧!用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思!

时间的表示还要注意:
  • 周与日月不可同时并存

另一个需要注意的地方在於:『你可以分别以周或者是日月为单位作为循环,但你不可使用「几月几号且为星期几」的模式工作』。 这个意思是说,你不可以这样编写一个工作排程:

30 12 11 9 5 root echo "just test" <==这是错误的写法 

本来你以为九月十一号且为星期五才会进行这项工作,无奈的是,系统可能会判定每个星期五作一次,或每年的 9 月 11 号分别进行,如此一来与你当初的规划就不一样了~所以,得要注意这个地方!上述的写法是不对的喔!

检查一下crond运行的任务结果
[[email protected] ~]$ cat /home/user1/date.txt 
Sun May 26 18:09:01 EDT 2013
Sun May 26 18:10:01 EDT 2013

4、在/var/log/里还有crond运行的日志信息:
[[email protected] ~]# grep 'date.txt' /var/log/cron 
May 26 18:09:01 kashu CROND[5569]: (root) CMD (date >> ~/date.txt)
May 26 18:10:01 kashu CROND[5580]: (root) CMD (date >> ~/date.txt)
May 26 18:11:01 kashu CROND[5588]: (root) CMD (date >> ~/date.txt)

5、通过crontab -r可以把自己所有的crond任务列表删除,如果只想删除其中的某几条,那就直接使用crontab -e去编辑,还可以使用#去注释掉
[[email protected] ~]$ crontab -l
* * * * * date >> ~/date.test
[[email protected] ~]$ crontab -r
[[email protected] ~]$ crontab -l
no crontab for user1

6、通过-u选项,root用户可以给其它用户添加crond任务
root给user1添加了一个任务
[[email protected] ~]# crontab -u user1 -e
*/1 * * * * date >> /home/user1/date.txt

[[email protected] ~]# crontab -l
no crontab for root

这个任务是属于user1的(任务执行时是以该用户的权限执行的)
[[email protected] ~]# su - user1
[[email protected] ~]$ crontab -l
*/1 * * * * date >> /home/user1/date.txt

7、禁用指定的用户使用crond服务
[[email protected] ~]# echo 'user1' > /etc/cron.deny 

当user1再去使用crond服务时,提示不允许命令该程序!
[[email protected] ~]# su - user1
[[email protected] ~]$ crontab -e
You (user1) are not allowed to use this program (crontab)
See crontab(1) for more information

8、其实,用户使用crontab -e设置的任务存放在/var/spool/cron里,以用户名命名的文件,甚至,root用户可以直接通过编辑这些文件来设置任务

[[email protected] ~]# ls /var/spool/cron/
root  user1
[[email protected] ~]# cat /var/spool/cron/root
* * * * * date >> /root/date.txt
root用户添加了一条周期性任务到/var/spool/cron/root文件中
[[email protected] ~]# echo '*/2 * * * * date >> /rot/date.txt' >> /var/spool/cron/root 
[[email protected] ~]# cat /var/spool/cron/root 
* * * * * date >> /root/date.txt
*/2 * * * * date >> /rot/date.txt
其实通过crontab -l查看时,内容是一样的
[[email protected] ~]# crontab -l
* * * * * date >> /root/date.txt
*/2 * * * * date >> /rot/date.txt
9、系统配置文件,/etc/crontab。可以把一些系统周期运行的任务放到这里去执行,因此,默认只有root能配置这个文件。

[[email protected] ~]# cat /etc/crontab 
SHELL=/bin/bash(执行任务时所使用的shell类型)
PATH=/sbin:/bin:/usr/sbin:/usr/bin(运行命令时所搜索的路径)
MAILTO=root(如果有额外的STDOUT/STDEER,以email形式发给谁,这里是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

如果文件是像上面这样,没有配置任何周期性执行的任务,那就需要手工添加了
以前的版本中默认是有下面这样4条周期性执行的任务存在的
[[email protected] ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly(每小时)
02 4 * * * root run-parts /etc/cron.daily(每天)
22 4 * * 0 root run-parts /etc/cron.weekly(每周)
42 4 1 * * root run-parts /etc/cron.monthly(每月)

前5个字段依然是执行时间,时间后面的那列是“执行者的身份”,run-parts是一个脚本(type run-parts可以看到脚本的所在位置),最后表示要执行的脚本的所在目录:
[[email protected] ~]# ls -d /etc/cron.*ly 
/etc/cron.daily  /etc/cron.hourly  /etc/cron.monthly  /etc/cron.weekly

那么,只要在相应的目录下放上需要执行的脚本,就会自动在相应的时间去执行它
[[email protected] ~]# cd /etc/cron.hourly/
[[email protected] cron.hourly]# ls
0anacron
1)在/etc/cron.hourly/下创建一个脚本
[[email protected] cron.hourly]# echo '#!/bin/bash' > date.sh
[[email protected] cron.hourly]# sed -i '$a date +%Y%m%d%H%M%s >> /root/date.txt' date.sh 

2)给该脚本添加可执行权限
[[email protected] cron.hourly]# chmod +x date.sh
3)因为/etc/crontab没有相应的运行条目,给加上就是了。下面的意思是每小时的05分钟时,执行/etc/cron.hourly目录下的脚本
[[email protected] ~]# sed -i '$a 05 * * * * root run-parts /etc/cron.hourly' /etc/crontab 
[[email protected] ~]# sed -n '$p' /etc/crontab 
05 * * * * root run-parts /etc/cron.hourly

检查一下,到了相应的时间时,脚本就被自动执行了。大家在测试时,可以先看一下当前的时间,然后把/etc/crontab的时间改成下一分钟,这样方便看效果。
[[email protected] ~]# cat date.txt 
20130527000501

10、或者,root用户直接把要执行的命令(或脚本)就写在/etc/crontab里

[[email protected] ~]# sed -i '$a 41 * * * * root date >> /root/date.txt' /etc/crontab 
[[email protected] ~]# sed -n '$p' /etc/crontab 
41 * * * * root date >> /root/date.txt
时间到了,也会被自动执行

[[email protected] ~]# cat date.txt 
20130527000501
Mon May 27 00:41:01 EDT 2013
相应的日志信息也能查看到
[[email protected] ~]# grep '00:41:01' /var/log/cron   
May 27 00:41:01 kashu CROND[9268]: (root) CMD (date >> /root/date.txt)

转载请注明:林志斌 » crontab,执行周期性任务

发表评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址