linux 定时任务之crontab

crond服务提供两种方式设置定时任务,一种是系统定时任务,一种是普通用户的定时任务。对于系统定时任务,是由系统管理员通过编写/etc/crontab配置文件来设定,crontab任务就存放在/etc/crontab文件里。而普通用户的定时任务可以通过当前用户,crontab -e的方式来编写,编写的定时任务存放在/var/spool/cron/$USER文件里。

crontab依赖于crond服务
service crond status
chkconfig --list|grep crond
软件包由crontabs-1.10-33.el6.noarch提供
rpm -qa|grep crontab

crond服务每隔1分钟会检查/etc/crontab以及/var/spool/cron/$USER文件内容,如果发现新增的,会重新加载变化文件加载至内存(cron日志里会出现:(system) RELOAD (/etc/crontab)),如果在修改配置文件后,想更快的执行,可以重启crond服务,通过检查/var/log/cron日志,发现可以加快几秒钟。

Sep  2 10:54:25 centos6 crond[4050]: (CRON) STARTUP (1.4.4)
Sep  2 10:54:26 centos6 crond[4050]: (CRON) INFO (running with inotify support)
Sep  2 10:54:26 centos6 crond[4050]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
Sep  2 10:55:02 centos6 CROND[4060]: (root) CMD (sh /tmp/test.sh)

Sep  2 10:56:01 centos6 crond[4050]: (*system*) RELOAD (/etc/crontab)

管理员编写系统例行性任务
vim /etc/crontab
在这个配置文件里需要指定执行命令的用户,而在crontab -e中是不需要的,因为crontab -e中就是当前登录用户来执行命令。
SHELL、PATH变量定义了在这个配置文件中的命令如果不写绝对路径时候,在哪里搜寻命令。所以一般建议写成绝对路径来执行。
MAILTO 用于将下面的定时任务执行过程中发生的错误和error发送给哪个用户的邮箱,当然也会记录在/var/log/cron日志中。

有两种方式写法:
1、指定定时间隔,写入执行命令,在这里建议指定执行用户
比如每隔1分钟由root打印一下时间发送到/tmp/time.txt文件里

*/1 * * * * root date>>/tmp/time.txt

2、通过run-parts命令运行指定目录下的所有shell脚本,这种只能在/etc/crontab中配置,在crontab -e中无法配置
比如每天3点50分让root用户执行一下test_sh目录下的所有脚本

(1)创建test_sh目录
mkdir -p /tmp/test_sh
(2)将shell脚本存放在test_sh目录里
shell脚本必须具有执行权限
chmod u+x *
(3)编写定时任务
50 03 * * * root run-parts /tmp/test_sh

系统默认的用于存放shell脚本的目录

[root@centos6 ~]# ls -ld /etc/cron*ly
drwxr-xr-x. 2 root root 4096 Sep 27  2011 /etc/cron.daily
drwxr-xr-x. 2 root root 4096 Sep 27  2011 /etc/cron.hourly
drwxr-xr-x. 2 root root 4096 Sep 27  2011 /etc/cron.monthly
drwxr-xr-x. 2 root root 4096 Sep 27  2011 /etc/cron.weekly
[root@centos6 ~]# 
比如每小时执行一次的任务,可以将脚本放在/etc/cron.hourly目录下
编写/etc/crontab,定在每小时15分执行
15 * * * * root run-parts /etc/cron.hourly

crontab的配置文件(格式说明)

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# 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

常见的用户的定时配置实例

说明:
*代表该列每个合法值
%代表换行,如果在crontab中某些命令涉及使用%,比如date命令,那么需要将%进行转义
,代表多个值,每个值用,分割开
a-b代表从某个区间范围,是闭区间。如“2-5”表示“2,3,4,5”
a/b 代表从a值开始,每隔b值执行一次。比如在分钟列上,2/47,从2分钟开始,每隔47分钟执行一次,也就是2,49,2...执行后续命令

在crontab中书写多条命令

*/2 * * * * date >/tmp/test3.log;/bin/date +'\%Y-\%m-\%d \%H:\%M:\%S'>>/tmp/test3.log
*/2 * * * * date >/tmp/test3.log && /bin/date +'\%Y-\%m-\%d \%H:\%M:\%S'>>/tmp/test3.log
*/2 * * * * date >/tmp/test3.log||/bin/date +'\%Y-\%m-\%d \%H:\%M:\%S'>>/tmp/test3.log

常见的命令执行间隔周期的设置

格式设置中,都是将条件进行求并集的关系

每一分钟执行一次command
* * * * * cmd
每小时的15,30,45,00执行一次命令
00,15,30,45 * * * * cmd
每天10:15,10:30,10:45执行该命令
15,30,45 10 * * * cmd
每天上午8-11点的第3和15分钟执行
3,15 8-11 * * * cmd
每隔2天的上午8-11点的第3和15分钟执行
3,15 8-11 */2 * * cmd
每个星期一的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 cmd
每月1、10、22日的4 : 45
45 4 1,10,22 * * cmd
每周六、周日的1 : 10
10 1 * * 6,0 cmd
每天18 : 00至23 : 00之间每隔30分钟
0,30 18-23 * * * cmd
晚上11点到早上7点之间,每隔1小时执行一次
* 23-07/1 * * * cmd
每月的4号与每周一到周三的11点【这里是取两个条件的并集,这个很重要】
00 11 4 * 1-3 cmd 

其他注意事项:
尽量不要将任务放在同一时间执行。


在crond中,最小定时单位是分钟,要实现每隔多少秒执行,必须借助脚本来实现

每隔2秒执行一次命令
* * * * *  sh test.sh
#!/bin/bash
step=2 
for (( i = 0; i < 60; i=(i+step) )); do  
   date +'%Y-%m-%d %H:%M:%S'>>/tmp/oracle.txt ;  
   sleep $step  
done  
exit 0  

每隔50秒执行一次命令
50秒均分多少分钟,而1分钟是60秒,那就是50和60的最小公倍数是300秒也就是5分钟。

*/5 * * * *  sh test.sh
#!/bin/bash
step=50 
for (( i = 0; i < 300; i=(i+step) )); do  
   date +'%Y-%m-%d %H:%M:%S'>>/tmp/oracle.txt ;  
      sleep $step  
done       
exit 0    


每隔90分钟执行一次
90分钟能均分多少小时,也就是90分钟和60分钟的最小公倍数180,也就是3个小时,那就每隔3个小时执行一次,而3个小时也能均分一天24小时,这3个小时内由90分钟均分。

* */3 * * *  sh test.sh
#!/bin/bash
step=5400 
for (( i = 0; i < 10800; i=(i+step) )); do  
   date +'%Y-%m-%d %H:%M:%S'>>/tmp/oracle.txt ;  
      sleep $step  
done       
exit 0    

修改当前用户crontab内容
crontab -e 其实修改的当前用户的crontab内容,文件是在/var/spool/cron/$USER里的内容

修改完成后,重启crond服务,在延迟几秒后执行crontab内容,否则linux的cron服务每隔一分钟去读取一次/var/spool/cron,/etc/crontab,/etc/cron.d

Aug 29 16:16:48 dg1 crond[24132]: (CRON) STARTUP (1.4.4)
Aug 29 16:16:50 dg1 crond[24132]: (CRON) INFO (running with inotify support)
Aug 29 16:16:50 dg1 crond[24132]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
.
.
.

Aug 29 16:17:01 dg1 CROND[24138]: (root) CMD (su - oracle -c  /home/oracle/test/test.sh 1>1.log 2>&1)
Aug 29 16:17:01 dg1 CROND[24139]: (root) CMD (root (/usr/sbin/ntpdate 1.cn.pool.ntp.org && /sbin/hwclock -w) &>/dev/null)

修改系统的crontab内容,在/etc/crontab中设定

/etc/cron.deny中的用户不允许执行crontab内容

/etc/cron.daily、/etc/cron.hourly、/etc/cron.monthly 这些目录下的脚本就是每天、每小时、每月要执行的脚本,

/etc/cron.d/下的文件是系统配置的定时crontab内容

crontab命令的使用:
1、查看当前用户的crontab任务
crontab -l
crontab -u oracle -l
2、删除当前用户的crontab内容
crontab -ri
crontab -u oracle -ri
3、编辑当前用户或者指定用户的crontab内容
crontab -e
crontab -u oracle -e

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值