Linux中的定时任务crontab

        在Linux中,可以使用crontbab指定定时任务。

        使用命令crontab -e即可编辑crontab,在里面添加需要的定时任务。用户的定时任务文件为 /var/spool/cron/用户名 ,crontab -e命令将相当于vim /var/spool/cron/用户名。

1、如何写crontab

        crontab中每一行代表一个任务,每个任务由周期和任务名组成。如下形式   

59 23 10 5 2014 /home/root/tesh.sh
#分 时 日 月  年    |<-------命令串------->|
        表示2014年5月10日23点59分,执行/home/root下的tesh.sh脚本。

        时间周期中可以使用一些辅助字符,如:

        *    表示任何时刻都可以

        ,  若有多个时刻,用逗号分隔

        -     表示一个时刻到另一时刻之间的时间段

        /n   表示每过n个时间单位

        比如,*/10 3-6 10,11 * * /home/root/tesh.sh 就表示 每年每月的10号和11号,3点到6点之间,每过10分钟执行一次tesh.sh

2、crontab注释

        在crontab中,#代表了注释,注释的存在,能够简化crontab的一些复杂操作。

        比如,如果有一个任务test.sh,每天都需要执行,每过10分钟执行一次,我们可以写成 */10 * * * * tesh.sh。现在有新要求,每天1点到1点10分不能执行,其余时间照旧。

        一种写法就是:将它拆成多条crontab,比如每天2点到0点执行,每天0点到1点执行,每天1点10分到2点执行。三条语句。这种方法的问题就是,如果再来新的要求呢,比如在此基础之上,每天8点到8点10分不能执行,这又怎么处理,写更多的crontab任务吗?

        另一种比较好的解决方案是:写一个run.sh脚本,每10分钟执行一次,首先判断当前时间是否是在1点到1点10分之间,如果不是,就执行tesh.sh,如果是,可以sleep10分钟。

        第三种非常好的方案就是利用注释。我们可以在1点时,将tesh.sh任务给注释掉,在1点10分,将tesh.sh任务的注释消除。要实现这种想法,需要使用sed命令。可以在crontab里面这样写:

#每隔10分钟执行一次
*/10 * * * * tesh.sh

#每天1点钟,将命令注释掉
0 1 * * * sudo sed -i 's\%\(\*\/10 \* \* \* \* tesh.sh\)\%#\1\%' /var/spool/cron/用户名

#每天1点零10分,将被注释的命令恢复
10 1 * * * sudo sed -i 's\%\(^##*\)\(\*\/10 \* \* \* \* tesh.sh\)\%\2\%' /var/spool/cron/用户名

       sed -i表示直接修改文件内容,之后的动作必须用单引号括上,单引号之后的是文件。单引号内部s表示替换,s之后的%是分隔符,代替默认的/分隔符,括弧表示将括号里面的内容保存下来,标记为1,#表示把注释扩展到下一个换行符以前,\1表示选取括号中的内容。

        这里出现了众多的反斜杠,都是用来做转义的,否则会被解析。

        其中%前面的反斜杠是用来转义crontab的,crontab中会将%解析成换行符。括弧和*前的反斜杠是因为sed会解析它们。

        如果不是在crontab中,这个命令可以写成 sed -i 's%\(\*\/10 \* \* \* \* tesh.sh\)%#\1%'  file


3、crontab的调试方式

        如果crontab不执行,我们可以使用 sudo vim /var/spool/mail/用户名查看系统发给用户的mail,可以通过时间点,来找出执行失败的原因。


参考:

《鸟哥的linux私房菜-基础学习篇(第三版)》

http://www.2cto.com/os/201111/112217.html

http://syre.blogbus.com/logs/69798652.html

http://idealab.iteye.com/blog/825935

http://www.3lian.com/edu/2013/06-05/73527.html


————The End————

已标记关键词 清除标记
语法: crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ] 说明: crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。 参数: -e [UserName]: 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe) -r [UserName]: 删除目前的时程表 -l [UserName]: 列出目前的时程表 -v [UserName]:列出用户cron作业的状态 时程表的格式如下: f1 f2 f3 f4 f5 program 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。 当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,其余类推 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推 当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推 使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。 由于unix版本不一样,所以部分语法有差别,例如在hp unix aix 中设定间隔执行如果采用*/n 方式将出现语法错误,在这类unix中 ,间隔执行只能以列举方式,详请见例子。 使用方法 用VI编辑一个文件 cronfile,然后在这个文件中输入格式良好的时程表。编辑完成后,保存并退出。[1] 在命令行输入 $: crontab cronfile 这样就将cronfile文件提交给c r o n进程,同时,新创建cronfile的一个副本已经被放在/ v a r / s p o o l / c r o n目录中,文件名就是用户名。 例子: 每月每天每小时的第 0 分钟执行一次 /bin/ls : 0 * * * * /bin/ls 在 12 月内, 每天的早上 6 点到 12 点中,每隔 20 分钟执行一次 /usr/bin/backup : */20 6-12 * 12 * /usr/bin/backup 周一到周五每天下午 5:00 寄一封信给 alex_mail_name : 0 17 * * 1-5 mail -s "hi" alex_mail_name < /tmp/maildata 每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha" 20 0-23/2 * * * echo "haha" 晚上11点到早上8点之间每两个小时,早上8点 0 23-7/2,8 * * * date 在hpunix,中,每20分钟执行一次,表示为:0,20,40 * * * * 而不能采用*/n方式,否则出现语法错误 注意: 1. 当程式在你所指定的时间执行后,系统会寄一封信给你,显示该程式执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可。 2. %在crontab中被认为是newline,要用\来escape才行。比如crontab执行行中,如果有"date +%Y%m%d",必须替换为:"date +\%Y\%m\%d" 创建crontab 在考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR。cron进程根据它来确定使用哪个编辑器编辑crontab文件。99 %的UNIX和LINUX用户都使用vi,如果你也是这样,那么你就编辑$HOME目录下的.profile文件,在其中加入这样一行: EDITOR=vi; export EDITOR 然后保存并退出。 不妨创建一个名为<user>cron的文件,其中<user>是用户名,为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为cron命令的参数: $ crontab davecron 现在该文件已经提交给cron进程,同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即,dave)。 列出crontab文件 为了列出crontab文件,可以用: $crontab -l 编辑crontab文件 如果希望添加、删除或编辑crontab文件中的条目,而EDITOR环境变量又设置为vi,那么就可以用vi来编辑crontab文件,相应的命令为: $ crontab -e 可以像使用vi编辑其他任何文件那样修改crontab文件并退出。 删除crontab文件 为了删除crontab文件,可以用: $ crontab -r 注释crontab文件 如果不希望删除写好的crontab文件,在该crontab文件前添加#将该文件注释掉。 恢复丢失的crontab文件 如果不小心误删了crontab文件,假设你在自己的$HOME目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username >是用户名。如果由于权限问题无法完成拷贝,可以用: $ crontab <filename> 其中,<filename>是你在$HOME目录中副本的文件名。 crontab中的输出配置 crontab中经常配置运行脚本输出为:>/dev/null 2>&1,来避免crontab运行中有内容输出。 shell命令的结果可以通过‘> ’的形式来定义输出 /dev/null 代表空设备文件 > 代表重定向到哪里,例如:echo "123" > /home/123.txt 1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null" 2 表示stderr标准错误 & 表示等同于的意思,2>&1,表示2的输出重定向等同于1 那么重定向输出语句的含义: 1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。 2>&1 表示标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页