cron是GNU/Linux提供的一种任务调度工具,它可以实现定时或者每个一段时间来执行指定的任务。cron利用crontab中存储的调度列表,来执行相关的定时或者周期性任务。
crond服务
绝大部分的Linux发行版本都带有cron命令。使用cron,必须先开启crond服务,crond是通过/etc/init.d/crond脚本启动,但我们可以让其他服务一样,通过以下命令查看/停止/开启crond服务。
service crond status
service crond start
service crond stop
service crond restart
service crond reload
crontab语法
“/etc/crontab “这个文件,给出了很好的示例
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
前面5个占位符是指定任务开始的时间或周期,user-name是执行命令的用户名,最后是待执行的命令。crontab的最小时间粒度是分钟,也意味着定时任务最多只能做到每分钟执行一次。
在表示时间的5个位置中,还有一些特殊的辅助字符,用以控制任务执行的粒度:
*(星号)代表任何时刻都接受的意思,例如 "0 * * * *"表示任何日期的每个小时整点执行后面的命令
,(逗号)代表分隔时段的意思,例如 "30 3,6 * * *"代表每天的3:30与6:30执行某个任务
-(减号)代表一段时间范围,例如 "20 8-12 * * *"代表每天的8点到12点的每小时20分进行某个任务
/n(斜线),n代表数字,代表每隔n单位的时间间隔,例如 "*/2 * * * *"代表每2分钟执行某个任务
cron编写自定义任务
cron会定期检查以下文件或目录,然后执行扫描到的任务:
/etc/anacrontab: system crontab is usually for running daily, weekly, monthly jobs.
/etc/cron.d/: where are system cronjobs stored for different users.
/var/spool/cron: that’s mean spool directory for user crontables.
/etc/anacrontab,保存的使用的crontab,不便进行修改。
使用方法
Method1.编写符合格式的crontab文件,然后将文件放到/etc/cron.d/目录下,crond便会定期执行,例如,我们想定期执行某个脚本,编写crontab格式的文件,假设命名为:testcron,内容为:
#每两分钟执行一次"/home/test/crond/test.sh"这个脚本,使用root身份去执行,执行这条命令产生输出重定向到"/dev/null"
*/2 * * * * root sh /home/test/crond/test.sh > /dev/null 2>&1
将testcron放置到”/etc/cron.d/”目录下
Method2.使用”crontab -e”编辑,它会自动调用”vi”对调度列表进行编辑,仍以上述为例:
# crontab -e
*/2 * * * * sh /home/test/crond/test.sh > /dev/null 2>&1
注意,这次没有指定root用户,因为我们当前就是以root目录编辑和执行的,如果加上root,在我们的环境中将会出错,将可以能为收到这样的一份错误提示邮件:You have mail in /var/spool/mail/root
打开后,发现错误为:/bin/sh: root: command not found
事实上,将以root执行”crontab -e”,所产生的crontab文件会被写到 /var/spool/cron/root文件中,这也真是crond定期扫描的文件夹。
如果只是要增减cron调度列表,可以使用”crontab -e”编辑,关于crontab还有以下命令
# crontab -l //列出所有用户的crontab列表
# crontab -l -u tester //列出指定tester用户的crontab列表
# crontab -r //清除所有用户的crontab列表
# crontab -r -u tester //清除指定tester用户的crontab列表
Method3.编辑”/etc/crontab”,增加新的定时任务,不推荐,多用户进行编辑容易造成混乱
# cat /etc/crontab
SHELL=/bin/bash <==使用哪种shell接口
PATH=/sbin:/bin:/usr/sbin:/usr/bin <==执行文件搜寻路径
MAILTO=root <==如果有额外的输出,以mail的形式发送给root
HOME=/ <==此shell所在的home目录
*/2 * * * * root sh /home/test/crond/test.sh > /dev/null 2>&1