首页 > Linux研究 > Crontab定时任务配置
2016
11-02

Crontab定时任务配置

CRONTAB概念/介绍

crontab命令用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。

cron 系统调度进程。 可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行。cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业。crontab命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。系统管理员可以通过cron.denycron.allow 这两个文件来禁止或允许用户拥有自己的crontab文件。

1: crontab文件一般位于/etc/下,这里面存放系统运行的的调度程序。

[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

2:每个用户都会生成一个自动生成一个自己的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

3:cron.deny 与 cron.allow文件

/etc/cron.deny 表示不能使用crontab 命令的用户

/etc/cron.allow 表示能使用crontab的用户。

默认情况下,cron.allow文件不存在。如果两个文件同时存在,那么/etc/cron.allow 优先。如果两个文件都不存在,那么只有超级用户可以安排作业。

但是让人纳闷的是cron.deny文件是空的,如下所示

[oracle@localhost etc]$ more cron.deny

4:cron.hourly,cron.daily,cron.monthly,cron.weekly

[oracle@localhost etc]$ ls -lrt cron*

-rw-r--r-- 1 root root 255 Sep 21 2004 crontab

-rw-r--r-- 1 root root 0 May 16 2008 cron.deny

cron.hourly:

total 0

cron.monthly:

total 8

-rwxr-xr-x 1 root root 278 Sep 29 2004 0anacron

cron.weekly:

total 16

-rwxr-xr-x 1 root root 277 Sep 29 2004 0anacron

-rwxr-xr-x 1 root root 414 Jun 6 2007 00-makewhatis.cron

cron.daily:

total 60

-rwxr-xr-x 1 root root 286 Aug 14 2004 tmpwatch

-rwxr-xr-x 1 root root 276 Sep 29 2004 0anacron

-rwxr-xr-x 1 root root 2133 Dec 1 2004 prelink

-rwxr-xr-x 1 root root 180 May 2 2006 logrotate

-rwxr-xr-x 1 root root 418 Jun 6 2007 00-makewhatis.cron

-rwxr-xr-x 1 root root 104 Aug 2 2007 rpm

-rwxr-xr-x 1 root root 121 Aug 22 2007 slocate.cron

lrwxrwxrwx 1 root root 28 May 16 2008 00-logwatch -> ../log.d/scripts/logwatch.pl

cron.d:

total 12

-rw------- 1 root root 366 Jun 12 2007 sa-update

-rw-r--r-- 1 root root 188 Jul 18 2007 sysstat


CRONTAB语法及应用

1:查看当前用户的定时任务

[oracle@localhost ~]$ crontab -l

* * * * * /home/oracle/test.sh >/dev/null 2>&1

2:编辑当前用户的定时任务

可以在编辑状态修改、删除、新增一些定时任务。注释一般用#

[oracle@localhost ~]$ crontab -e

3:删除当前用户的定时任务

[root@localhost ~]# crontab -r

[root@localhost ~]# crontab -l

no crontab for root

4:如下所示,一般crontab文件里面的定时任务格式如下所示:

59 23 * * * /home/oracle/scripts/alert_log_archive.sh >/dev/null 2>&1

crontab 文件中每个条目中各个域的意义和格式:

第一列 分钟: 1——59

第二列 小时: 1——23(0表示子夜)

第三列 日 : 1——31

第四列 月 : 1——12

第五列 星期: 星期0——6(0表示星期天,1表示星期一、以此类推)

第六列 要运行的命令

我们暂且用C1、C2、C3、C4、C5、C6代表这六列,前面五列通过组合方式来决定执行脚本的频率,最小频率为每分钟执行一次,其中Cn可以用 * ; */n ; T1-T2; a,b,c; 四种形式来表示:

当 C1 为 * 时表示每分钟都要执行脚本,C2 为 * 时表示每小时都要执行程式,依次类推.....

当 C1 为 T1-T2 时表示从第 T1 分钟到第 T2 分钟这段时间内要执行,C2 为 T1-T2 时表示从第 T1 到第 T2 小时都要执行,依次类推....

当 C1 为 */n 时表示每 n 分钟的时间间隔执行一次,C2 为 */n 表示每隔n小时的间隔执行一次,依次类推.....

当 C1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,C2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,依次类推....

下面列举几个例子供大家参考

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

..............................................

关于 >/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: 尽量所有的文件都采用完全路径方式,避免使用相对路径。

-----------------------------------------------------------------

1、定时任务crond介绍

 

1>定时任务软件种类

at 适合仅执行一次就结束的调度命令,需要启动一个后端的atd服务。

crontab 需要启动一个服务crond才行,crond服务通过crontab命令实现。

anacron 无法周期性执行,只能以天为周期,但有个特点,在关机状态下未执行的任务,下次开机时可以补上执行

注:crontab为最常用的定时任务。

 

2>crontab工作

运行linux后,开机自启动crond任务,系统会每分钟检查是否有要执行的任务工作(循环检测)

默认系统中可以登陆的用户,都可以使用crontab定义计划任务。不过,可以通过/etc/cron.allow文件限制权限。

 

3>crontab支持两种状态:

a.直接编写计划任务;

b.使用目录的方式,放在目录里面的都会定时执行,定时目录可在/etc/crontab中设定。

 

2crond定时任务限权

可对各用户使用定时任务进行管理

 

1)拒绝用户使用crontab任务

/etc/cron.deny中添加要拒绝的用户名,格式如下:

listen

nobody

noaccess

username1

username2

username3

.

 

2)允许用户访问crontab任务

/etc/cron.allow中添加要允许的用户名,格式如下:

root

username1

username2

.

 

3)定期执行一个目录下的文件

/etc/crontab中添加目录,格式如下:

01 * * * * root run-parts 目录

注:使用run-parts可定义定期执行的目录

 

4)限权测试

1>添加用户

[root@test ~]# useradd test

[root@test ~]# echo 123456 |passwd test--stdin  #<==非交互模式创建密码

Changing password for user test.

passwd: all authentication tokensupdated successfully.

 

2>拒绝测试

[root@test ~]# cat /etc/cron.deny 

test

[root@test ~]# 

[root@test ~]# su - test

[test@test ~]$ crontab -e

You (test)are not allowed to use this program (crontab)

See crontab(1) for more information

cron.deny中加入用户后,该用户没有权限编辑定时任务

 

3>允许测试

[root@test ~]# cat /etc/cron.allow

test

[root@test ~]# su - test

[test@test ~]$ crontab -e   #<==test用户编辑成功

*/1 * * * * echo successful >/tmp/a.log

[test@test ~]$ crontab -l

*/1 * * * * echo successful >/tmp/a.log

cron.allow中加入用户后,该用户能编辑定时任务

 

4>清空允许用户

[test@test ~]$ su - root

Password: 

[root@test ~]# echo >/etc/cron.allow

[root@test ~]# su - test

[test@test ~]$ crontab -l  #<==test用户连查看的权限都没有

You (test)are not allowed to use this program (crontab)

See crontab(1) for more information

[test@test ~]$ cat /etc/cron.deny

test

清空cron.allow允许用户后,该用户又被cron.deny拒绝,

得出结论:/etc/cron.allow优先于/etc/cron.deny配置

 

3Crontab用法

 

[root@yang1 data]# crontab --help   #<==注:crontab –l –e都是直接操作/var/spool/cron/当前用户名的文件

usage: crontab [-u user] file    #<==指定某用户crontab –u yang2 –e,编辑yang2家目录下的crontab

    crontab [-u user] [ -e | -l | -r ]

        (default operation is replace,per 1003.2)

    -e   (edit user's crontab)  #<==编辑当前用户的定时任务

    -l   (list user's crontab)  #<==查看当前用户的定时任务

    -r   (delete user's crontab)  #<==删除定时任务

    -i   (prompt before deletinguser's crontab) #<==删除crontab文件内容,删前会有提示

    -s   (selinux context)

注:crontab –e 编辑定时任务,退出时可以检查语法,直接编辑/var/spool/cron/root不能。如果大批量添加任务,则使用echo追加。

cron执行的每一项工作都会被纪录到/var/log/cron这个日志文件中,可以从这个文件查看命令执行的状态。

 

4Crontab命令的书写格式

 

  *      *     *      *     *    /bin/sh /scripts/yy.sh

  分     时     日     月     周    命令和文件路径

(00-59)  (0-23)   (1-31)   (1-12)    (0-6)         

所用符号表示意思

星号每的意思

减号连续一段时间,如:00 17-19 * * * cmd  每天下午17点,18点,19点执行一次命令

逗号多个时间段,如:00 10-11,17-19 * * * cmd 每天的上午10,11点整,下午的17,18,19点整执行一次命令

/n n代表数字,指每隔n时间执行一次,如: */2 * * * * cmd 每隔2分钟执行一次命令

 

1)举例:

30 12-16/2 * ** cmd 

每天的中午12点到下午4点间,每隔2小时执行一次

* 23-7/1 * * 25pxd 

注:这是一个错误的命令

日和周不能同时用,若要以月为间隔,则日或周必有一个有值

其它如:小时上有值,则分钟上也要有值

*/1 * * ** echo yangrong >>/var/log/yy > /dev/null 2>&1

每隔一分钟把yangrong打印到yangrong1文件中,但该命令无法执行,因为>>>/dev/null不可同时使用

 

2/dev/null 2>&1解释

 

0是标准输入    使用<<<

1是标准输出    使用>>>

2是标准错误输出  使用2>2>>

>/dev/null 2>&1  即错误输出与标准输出全部重定向到空,可以写成1>/dev/null 2>/dev/null

 

3)关于重定向的作用

重定向到空可以避免碎片文件占用inode资源

重定向到一个指定log里,可以看任务是否执行

 

4)关于导致磁盘inode满情况分析

定时任务执行成功or失败时,程序会向上层发送mail,由于平时工作中不打开sendmail功能,所以邮件会存储在临时目录/var/spool/clientmqueue,随着执行的任务次数多,文件也会越来越多,直到某一天,添加文件时,提示No space left on device主要问题原因不在于垃圾文件会占很大空间,而在于每个文件会占用inode节点。centos6.4默认不装sendmail,可能不会导致这个问题发生)。

所以crontab规则后需加 /dev/null 2>&1

注:>>  >/dev/null 2>&1不可同时存在,不然无法执行

 

 

5)重启crond服务

/etc/init.d/crond status  #查看当前运行状态

/etc/init.d/crond restart #重启

/etc/init.d/crond reload  #平滑重启

 

5、定时服务器时间同步

 

1)手动同步

[root@yang1 data]# which ntpdate

/sbin/ntpdate

[root@yang1 data]# /sbin/ntpdate time.windows.com

 

2)自动同步(使用定时任务)

#sync systime by yangrong at 2013-9-4         

*/5 * * * * /sbin/ntpdate time.windows.com>/dev/null 2>&1

注:当局域网内的服务器足够多时(500+),则需自己在局域网搭建ntp server

 

 

6、写定时任务注意点:

掌握了下面7点,写定时任务就不在犯错。

序号

注意点

1

每个任务添加注释,谁写的,什么时间写的,完成什么需求?

2

执行脚本使用/bin/sh(防止脚本无执行权限),要执行的文件路径是从根开始的绝对路径(防止找不到文件)

3

尽量把要执行的命令放在脚本里,然后把脚本放在定时任务里。对于调用脚本的定时任务,可以把标准输出错误输出重定向到空。

4

定时任务中带%无法执行,需要加\转义

5

如果时上有值,分钟上必须有值

6

日和周不要同时使用,会冲突

7

>>>/dev/null 2>&1不要同时存在

书写举例:

#backup mysql byyangrong at 2013-9-4

30 4 * * * /bin/shtar_mysql.sh >/dev/null 2>&1 

 

7、调试定时任务

一个任务不能轻易的直接推上线上服务器,需要在测试服务器上测试好。

 

序号

调试方法

1

增加频率调试任务,如:生产环境2小时一次,测试机2分钟一次

2

加快时间调试任务,如:生产环境1天后执行,则添加任务后修改设备时间

3

重定向到一个日志里,查看任务执行情况。一个是定时任务后加log,一个是脚本后加log

4

环境变量可能导致问题

5

通过日志定位问题。  tail /var/log/cron

 

 

作者:admin
admin
TTF的家园-www.ttfde.top 个人博客以便写写东西,欢迎喜欢互联网的朋友一起交流!

本文》有 0 条评论

留下一个回复