Crontab定时任务配置

crontab简介

crontab常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。crontab命令允许用户提交、编辑或删除相应的作业。其中:

  1、cron是服务名称;
  2、crond是后台进程;
  3、crontab是计划任务表;

crontab的原理

当使用者使用 crontab 这个命令来创建工作排程之后,该项工作就会被纪录到 /var/spool/cron/ 里面去了,而且是以帐号来作为判别的!举例来说, blue 使用 crontab 后, 他的工作会被纪录到 /var/spool/cron/blue 里头去!但请注意,不要使用 vi 直接编辑该文件, 因为可能由于输入语法错误,会导致无法运行 cron !另外, cron 运行的每一项工作都会被纪录到 /var/log/cron 这个登录档中,所以,如果你的 Linux 不知道是否被植入木马时,也可以搜寻一下 /var/log/cron 这个登录档!

crond服务的最低侦测限制是『分钟』,所以『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 』,因此,只要你编辑完 /etc/crontab 这个文件,并且将他储存之后,那么 cron 的配置就自动的会来运行了!

备注:在 Linux 底下的 crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工作事项,但是某些原因或者是其他的 Unix 系统中,由於 crontab 是读到内存当中的,所以在你修改完 /etc/crontab 之后,可能并不会马上运行, 这个时候请重新启动 crond 这个服务吧!『/etc/init.d/crond restart』

任务分类

1、系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件,内容如下:

[root@localhost cron]# more /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

前四行用来配置crond任务运行的环境变量,其中:第一行SHELL变量指定了系统要使用哪个shell,这里是bash;第二行PATH变量指定了系统执行命令的路径;第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户;第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。

2、用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用crontab来定制自己的计划任务。每个用户都会生成一个自动生成一个自己的crontab文件,一般位于/var/spool/cron目录下,其文件名与用户名一致。

[root@localhost cron]# cd /var/spool/cron
[root@localhost cron]# ls
oracle root

如果你用命令crontab -r 就会删除当前用户的crontab文件,例如你切换到oracle账号下,执行了该命令,那么/var/spool/cron/oracle文件就会删除,如果要创建该文件只需要用crontab -e命令即可。注意,普通用户一般没有权限访问/var/spool/cron

crontab的语法

crontab [-u username] [-l|-e|-r]
选项与参数:
-u  :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程;
-e  :编辑 crontab 的工作内容,如果不指定用户,则表示编辑当前用户的crontab文件内容
-l  :查阅 crontab 的工作内容,如果不指定用户,则表示编辑当前用户的crontab文件内容
-[i]r  :移除某个用户所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑如果不指定用户,则默认删除当前用户的crontab文件。-i参数指定在删除用户的crontab文件时是否给确认提示。

查询使用者目前的 crontab 内容:

crontab -l
*/5 * * * *  /home/blue/do/rsyncfile.sh
0 2 1 4 *  /home/blue/do/rsyncfile_day.sh

清空使用者目前的 crontab(慎用):

crontab -r
crontab -l
no crontab for blue

编辑使用者目前的crontab用 crontab -e,可以在编辑状态修改、删除、新增一些定时任务。注释一般用# :

crontab -e

默认情况下,任何使用者只要不被列入 /etc/cron.deny 当中,那么他就可以直接下达『 crontab -e 』去编辑自己的例行性命令了!整个过程就如同上面提到的,会进入 vi 的编辑画面, 然后以一个工作一行来编辑,编辑完毕之后输入『 :wq 』储存后离开 vi 就可以了!

crontab的限制

每一个用户都可以有一个crontab文件来保存调度信息。系统管理员可以通过cron.deny 和 cron.allow 这两个文件来禁止或允许用户拥有自己的crontab文件。crontab文件一般位于/etc/下,这里面存放系统运行的的调度程序。

/etc/cron.allow:将可以使用 crontab 的帐号写入其中,若不在这个文件内的使用者则不可使用 crontab;

/etc/cron.deny:将不可以使用 crontab 的帐号写入其中,若未记录到这个文件当中的使用者,就可以使用 crontab 。

以优先顺序来说, /etc/cron.allow 比 /etc/cron.deny 要优先, 而判断上面,这两个文件只选择一个来限制而已,因此,建议你只要保留一个即可, 免得影响自己在配置上面的判断!一般来说,系统默认是保留 /etc/cron.deny , 你可以将不想让他运行 crontab 的那个使用者写入 /etc/cron.deny 当中,一个帐号一行!

crontab内容格式

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

  minute   hour   day   month   week   command
  其中:

     1、minute: 表示分钟,可以是从0到59之间的任何整数;

     2、hour:表示小时,可以是从0到23之间的任何整数;

     3、day:表示日期,可以是从1到31之间的任何整数;

     4、month:表示月份,可以是从1到12之间的任何整数;

     5、week:表示星期几,可以是从0到6之间的任何整数,这里的0代表星期日;

     6、command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

前五个时间设定段,可以含如下特殊字符:

     1、星号(*):代表所有可能的值,例如hour字段如果是星号,则表示在满足其它字段的制约条件后每小时都执行该命令操作;

     2、逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”;

     3、中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”;minute为 T1-T2 时表示从第 T1 分钟到第 T2 分钟这段时间内要执行

     4、正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

周与日月不可同时并存:

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

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

例子:

     1、59 23 * * * /home/oracle/scripts/alert_log_archive.sh >/dev/null 2>&1
     表示每天23点59分执行脚本/home/oracle/scripts/alert_log_archive.sh
     
     2、*/5 * * * * /home/oracle/scripts/monitoring_alert_log.sh >/dev/null 2>&1 
     表示每5分钟执行一次脚本/home/oracle/scripts/monitoring_alert_log.sh

     3、0 20 * * 1-5 mail -s "**********" kerry@domain.name < /tmp/maildata
     周一到周五每天下午 20:00 寄一封信给 kerry@domain.name

Crontab重启

Linux:Service crond restart 或者/etc/init.d/crond restart
Mac:sudo /usr/sbin/cron restart

关于 >/dev/null 2>&1 的解释:

0表示键盘输入
1表示标准输出
2表示错误输出.
我们首先创建test.sh脚本如下:

#! /bin/sh
echo "hello, everybody, now is " `date`
date >> test.txt

然后添加作业

* * * * * /home/oracle/test.sh >/home/oracle/log.txt & # 默认值为1,即和下面命令一致

* * * * * /home/oracle/test.sh 1>/home/oracle/log.txt &

* * * * * /home/oracle/test.sh 2>/home/oracle/log.txt &

* * * * * /home/oracle/test.sh 2>/home/oracle/log.txt 2>&1 &

1,2将tesh.sh 命令输出重定向到log.txt, 即输出内容不打印到屏幕上,而是输出到log.txt文件中。如果你需要追加而不是覆盖,可以用 >>代替>
2>&1 是将错误输出重定向到标准输出。 然后将标准输入重定向到文件log.txt。
&1 表示的是文件描述1,表示标准输出,如果这里少了&就成了数字1,就表示重定向到文件1。

注意事项:
配置定时任务时,需要注意两个问题:
1: 在SHELL中设置了必要的环境变量;例如一个shell脚本手工执行OK,但是配置成后台作业执行时,获取不到ORACLE的环境变量,这是因为crontab环境变量问题,Crontab的环境默认情况下并不包含系统中当前用户的环境。所以,你需要在shell脚本中添加必要的环境变量的设置
2: 尽量所有的文件都采用完全路径方式,避免使用相对路径。

crond服务操作命令

1、service crond start 启动服务
2、service crond stop 关闭服务
3、service crond restart 重启服务
4、service crond reload 重新载入配置
5、/sbin/service crond status 服务是否运行

cron的定时任务备份恢复

如果使用crontab -r 误删了定时任务 在/var/spool/cron下有定时任务的备份.可以通过该cron找回
如果没有权限 的话 su - + root.password 在root用户下 进行查看

使用技巧

crontab最小时间单位是分,如果需要在秒级设置定时任务,使用sleep延时:如果每10秒执行一次,每分钟60秒,可以看成:6个同时执行的crontab任务,第一个任务0秒执行,第二个任务延时10秒执行,第三个任务延时20秒执行,以此类推,得到:

* * * * *  command
* * * * * sleep 10; command
* * * * * sleep 20; command
* * * * * sleep 30; command
* * * * * sleep 40; command
* * * * * sleep 50; command
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

strggle_bin

一毛不嫌少,十元不嫌多

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值