1、Crontab程序
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。
crontab文件包含送交cron守护进程的一系列作业和指令。每个用户可以拥有自己的crontab文件;同时,操作系统保存一个针对整个系统的crontab文件,该文件通常是/etc/crontab,而这个文件只能由系统管理员来修改。
cronie:主程序包,提供crond守护进程及相关辅助工具。
# rpm -ql cronie /etc/cron.d /etc/cron.d/0hourly /etc/cron.deny #权限控制,黑名单 /etc/pam.d/crond /etc/sysconfig/crond /usr/bin/crontab /usr/lib/systemd/system/crond.service /usr/sbin/crond /var/spool/cron
crontabs:系统自带的一些计划任务。
# rpm -ql crontabs /etc/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/cron.weekly /etc/crontab /etc/sysconfig/run-parts /usr/bin/run-parts
cronie-anacron:cronie的补充程序,用于监控cronie任务的执行状况。
# rpm -ql cronie-anacron /etc/anacrontab /etc/cron.hourly/0anacron /usr/sbin/anacron /var/spool/anacron /var/spool/anacron/cron.daily /var/spool/anacron/cron.monthly /var/spool/anacron/cron.weekly
对于24小时开机运行的服务器可能用不到的,但是对非24小时开机,又想定时运行任务的机器还是十分有用的。
anacrontab负责执行 /etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly 中的系统任务。
当执行任务时,更新/var/spool/anacron/文件的时间戳。
anacron的配置与cron类似,也是要首先配置一个叫anacrontab的文件,其文件格式说明一般在manual里有man anacrontab
# vim /etc/anacrontab @reboot : Run once after reboot. @yearly : Run once a year, ie. "0 0 1 1 *". @annually : Run once a year, ie. "0 0 1 1 *". @monthly : Run once a month, ie. "0 0 1 * *". @weekly : Run once a week, ie. "0 0 * * 0". @daily : Run once a day, ie. "0 0 * * *". @hourly : Run once an hour, ie. "0 * * * *".
anacron的工作原理参考这里:http://blog.csdn.net/deerlux/article/details/51090531
crontab在 /etc 目录下面存在 cron.d、cron.daily、cron.weekly、cron.monthly、cron.hourly 五个目录和 crontab、cron.deny 二个文件。
cron.daily是每天执行一次的job
cron.weekly是每个星期执行一次的job
cron.monthly是每月执行一次的job
cron.hourly是每个小时执行一次的job
cron.d是系统自动定期需要执行的任务,如果不是按小时,按天,按星期,按月来执行的,那么就放在这个目录下面。
如果是按小时,按天,按星期,按月的来执行的话,则可以放到前面相应的目录下面去。
/etc/cron.hourly/ 的执行任务定义在 /etc/cron.d/0hourly 文件中。
在/var/spool下面存在着两个目录cron,anacron。
/var/spool/cron 目录下面是每个用户自己通过 crontab -e 增加的crontab的内容。
/var/spool/anacron 目录下面是记录的是cron.daily,cron.monthly,cron.weekly上一次执行的时间。
crond服务每隔一分钟去读取一次/var/spool/cron,/etc/crontab,/etc/cron.d 下面的所有内容,以实现任务的执行。
2、crontab权限
/etc/cron.allow 和 /etc/cron.deny 文件被用来限制对 cron 的使用。
这两个控制文件的格式都是每行一个用户。两个文件都不允许有空格。
如果控制文件被修改了,cron守护进程 crond 不必重启。控制文件在每次用户添加或删除一项 cron 任务时都会被读取。
/etc/cron.allow 的优先级高于 /etc/cron.deny。
如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且cron.deny 文件会被忽略。
如果 cron.allow 文件不存在,所有在cron.deny 中列出的用户都被禁止使用 cron。
3、crontab命令
crontab [-u user] [-l | -r | -e] [-i] -u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。 file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们 载入crontab。 -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。 -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。 -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。 -i:在删除用户的crontab文件时给确认提示。
4、crontab语法
crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
1、系统cron任务
系统的crontab存放在 /etc/crontab
# vim /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # 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 a、每一行定义一个周期性任务,共7个字段。 b、此处的环境变量不同于用户登录后获得的环境,因此建议命令使用绝对路径。 c、执行结果会发送邮件给mailto指定的用户。
2、用户cron任务
用户的crontab文件存放在 /var/spool/cron/USERNAME # crontab -e -u USERNAME a、每一行定义一个周期性任务,共6个字段。 b、此处的环境变量不同于用户登录后获得的环境,因此建议命令使用绝对路径。 c、执行结果会发送邮件给当前用户。 星号(*)匹配所有有效的值。 短横线(-)表示范围连续取值。 逗号(,)表示离散取值。 正斜线(/)指定间隔频率。例如,0-59/2 在分钟字段表示每两分钟。 指定的时间点不能被步长整除时,其意义将不存在。例如 */7 * * * * 注意:%在crontab中被认为是newline,使用时需要用 \ 转义。比如crontab文件中,如果有 "date +%Y%m%d",必须替换为:"date +\%Y\%m\%d"。
crontab的最小时间单位为”分钟“,想完成”秒“级任务,得需要借助于其它方式。
先定义为每分钟任务,再利用脚本实现在每分钟之内,循环执行多次。
sleep命令 delay for a specified amount of time. s: 秒,默认单位 m: 分 h: 小时 d: 天 usleep命令 sleep some number of microseconds.The default is 1. # usleep 1000000 休眠1秒
示例:
*/5 * * * * 每5分钟执行一次 3 * * * * 每小时的第3分钟执行一次 3 4 * * 5 每周5的4点3分执行一次 5 6 7 * * 每月的7号的6点5分执行一次 7 8 9 10 * 每年的10月9号8点7分执行一次 9 8 * * 3,7 每周3和周日的8点9分 0 8,20 * * 3,7 每周3和周日的8点和20点执行一次 0 9-18 * * 1-5 周一到周五的9-18点,即工作时间内的每小时 0 7 25 12 * 每年的12月25号7点执行一次
5、crontab服务
安装crontab: yum install crontabs 服务操作说明: /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 /sbin/service crond reload //重新载入配置 /sbin/service crond status //启动服务 查看crontab服务是否已设置为开机启动,执行命令: ntsysv 加入开机自动启动: chkconfig –level 35 crond on
6、常用方法
1). 创建一个新的crontab文件
在考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR。cron进程根据它来确定使用哪个编辑器编辑 crontab文件。99%的UNIX和LINUX用户都使用vi,如果你也是这样,那么你就编辑$ HOME目录下的. profile文件,在其 中加入这样一行:
EDITOR=vi; export EDITOR
然后保存并退出。不妨创建一个名为<user> cron的文件,其中<user>是用户名,例如, davecron。在该文件中加入如下的内容。
# (put your own initials here)echo the date to the console every # 15minutes between 6pm and 6am 0,15,30,45 18-06 * * * /bin/echo ‘date’ > /dev/console
保存并退出。确信前面5个域用空格分隔。
在上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些 系统中,用tty1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为 cron命令的参数:
$ crontab davecron
现在该文件已经提交给cron进程,它将每隔15分钟运行一次。
同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。
2). 列出crontab文件
为了列出crontab文件,可以用:
$ crontab -l 0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1
你将会看到和上面类似的内容。可以使用这种方法在$HOME目录中对crontab文件做一备份:
$ crontab -l > $HOME/mycron
这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。
3). 编辑crontab文件
如果希望添加、删除或编辑crontab文件中的条目,而E D I TO R环境变量又设置为v i,那么就可以用v i来编辑crontab文件,相应的命令为:
$ crontab -e
可以像使用vi编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时,cron会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。
我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month 30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;
现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。
现在让我们使用前面讲过的crontab -l命令列出它的全部信息:
$ crontab -l # (crondave installed on Tue May 4 13:07:43 1999) # DT:ech the date to the console every 30 minites 0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1 # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month 30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;
4). 删除crontab文件
要删除crontab文件,可以用:
$ crontab -r
5). 恢复丢失的crontab文件
如果不小心误删了crontab文件,假设你在自己的$HOME目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完成拷贝,可以用:
$ crontab <filename>
其中,<filename>是你在$HOME目录中副本的文件名。
我建议你在自己的 $HOME目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。
有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。