计划任务

计划任务:
    让系统在将来的指定时间点执行某些任务(程序);任务可以周期性执行也可以仅仅执行一次。
Linux系统中的计划任务:at 和 cron服务是操作系统内置的2个服务,默认情况是安装好的。
 at服务:指定某个时间一次性执行某个任务,依赖于系统后台atd进程
cron服务:指定时间周期性执行某个任务,依赖于系统后台crond进程

at任务计划:
1、确认at这个服务是否已经安装:
# rpm -q at
at-3.1.10-43.el6_2.1.x86_64
2、相关的文件:
# rpm -ql at |grep etc
/etc/at.deny      用户控制列表,拒绝用户列表/etc/at.allow(默认么有,允许列表);默认是允许所有用户使用at服务
/etc/rc.d/init.d/atd   at服务的启动脚本
/etc/pam.d/atd        验证机制
/usr/bin/at         --命令
/usr/bin/atq        --查看at的任务列表
/usr/bin/atrm       --删除任务
/var/spool/at/xxx       --计划任务的文本文件保存目录
3、常用的命令:
at:制定一个一次性计划任务
-l 列出at任务 等于atq
-d 删除at任务 等于atrm
-c 查看任务内容

batch:以一个低优先级延时执行任务
4、查看服务状态:
# /etc/rc.d/init.d/atd status   --查看atd服务的状态
# /etc/rc.d/init.d/atd start        --启动atd服务
#  chkconfig atd --list
# chkconfig atd on          --设置开机时启动at服务
# service atd start  <---保证处于运行状态
5、命令格式:
at 3:30pm    
at 15:30
at 10:10 today
at now+2min    ——2分钟后执行
at 4pm + 3 days  —3天以后的下午4点运行此job
at 10am Jul 31     —在731日上午10点运行此job
at 1am tomorrow   —明天上午1点运行此job
at 4:00 2020-12-12  —在2020-12-12日的凌晨4点执行
at -t 09201430  ——920日的下午2:30运行此job
at -t 202009201430      ——2020年的920日的下午2:30运行此job
# man at
at now + 5 minutes 任务在5分钟后运行
at now + 1 hour 任务在1小时后运行
at now + 3 days 任务在3天后运行
at now + 2 weeks 任务在两周后运行

crtl + d    --结束

实例:比较复杂的任务可以保存到脚本:
 vim /root/useradd.sh  

#!/bin/bash
for i in {1..3};
  do useradd user$i
done
echo "user is ok">>/tmp/user.log
# chmod 755 /root/useradd.sh
 调用脚本执行
#at -f /root/useradd.sh now +1min
#at -f /root/useradd.sh -t 07271515

at服务访问控制:
++++++++++++++++++++++
/etc/at.allow    作用:只允许文件里面出现的用户使用atd这个服务,如果这个文件存在,就不去考虑at.deny.
/etc/at.deny   作用:只拒绝里面的用户使用atd。如果at.allow不存在的时候,才生效

crontab 周期性计划任务
当需要周期性地重复执行任务时可以使用cron服务;该服务每分钟检查一次,并执行符合条件的任务。
1、查看服务是否启动
service crond status
/etc/init.d/crond status
2、查看相关文件列表
which crontab
rpm -qf /usr/bin/crontab
# rpm -ql crontabs
rpm -ql cronie
/var/spool/cron  用户级别的计划任务存放目录(以用户命名)
/etc/cron.deny
/etc/pam.d/crond
/etc/rc.d/init.d/crond 启动脚本
/usr/bin/crontab  用户级别的命令
/usr/sbin/crond   二进制的命令


/etc/cron.d/        里面通常存放用来设定除了每天/每周/每月之外的定时任务,比如说每小时周期执行的任务和其他任何定时任务。
/etc/cron.d/0hourly    系统每小时第一分钟需要执行的任务
/etc/cron.deny          用户拒绝列表(在该文件中的用户不能使用cron服务)
/etc/crontab             该文件的作用相当于/etc/cron.d/下面的某一个文件,可以定义系统计划任务。
/var/spool/cron         这个目录用来存放各个用户自己设定的定时任务,普通用户没有权限直接访问,必须通过crontab 命令(setuid)
/etc/cron.monthly/   存放系统每个月需要执行的脚本
/etc/cron.weekly/     存放系统每周需要执行的脚本
/etc/cron.daily/        存放系统每天需要执行的脚本
/etc/cron.hourly/     存放系统每小时需要执行的脚本

3、 crontab 格式说明
# cat /etc/crontab    这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。

SHELL=/bin/bash     默认的shell,告诉系统使用哪个shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin   定义命令的路径
MAILTO=root   命令的执行结果以邮件的形式发送给root(不管是标准正确还是错误结果),如果MAILTO=“” ,代表不会发邮件给任何人。
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 executed5个字段分别表示:
    分钟:0-59
    小时:0-23
    日期:1-31
    月份:1-12
    星期:0-70表示周日或者7表示周日)

还可以用一些特殊符号:
  ,: 表示分割,间隔。如第二个*表示成 8,10,就表示8点和10点
-:表示一个段,如第二个*表示成 1-5,就表示15点
/n : 表示每个n的单位执行一次,如第二个*表示成*/1, 就表示每隔1个小时执行一次命令。

* 810 * * *
* * 2-8 * * 
*/5 * * * *

00 10 5 * *
30 22 1 1 *
00 81012 * * 135
00 8-12/2 * * 135
00 05 * * 1

02 8-20/3 * * 7|0
03 04 115 * *




以下4行是rhel5里的配置;rhell6看不到,但是也生效
01 * * * * root run-parts /etc/cron.hourly/
02 04 * * * root run-parts /etc/cron.daily/
22 04 * *7 root run-parts /etc/cron.weekly/
42 041** root run-parts /etc/cron.monthly/

注意:
run-parts:
cron用这个工具来执行某个目录下所有的可执行脚本,定时任务中的每小时/每天/每周/每月任务就是通过这个工具来触发的。

/etc/cron.d/中的文件的范例:
# cat /etc/cron.d/0hourly 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly
每小时的第一分钟,以root用户执行/etc/cron.hourly目录下的脚本

制定系统计划任务
方法一:自己编写计划任务文件

方法二:将自己的计划任务放到相应的系统任务目录里
系统自己的计划任务:/etc/cron.{daily,weekly,monthly} 


思考1:
如果系统断电或者宕机,错过任务执行的时间,怎么办?

anacron 任务:
    是cron服务的扩展,配合cron服务一起使用,当系统断电或者宕机,错过任务执行的时间时,系统启动后它会再次执行未执行的任务。
配置文件:/etc/anacrontab 

#period in days                 delay in minutes      job-identifier   command
命令执行的频率(天数)    延迟时间(分钟)         任务描述               要执行的命令
1                                       5   cron.daily              nice         run-parts /etc/cron.daily
7                                       25  cron.weekly             nice        run-parts /etc/cron.weekly
@monthly                           45   cron.monthly            nice        run-parts /etc/cron.monthly

说明:对于每个计划任务,anacrontab先判断在period(执行频率)期间内是否被执行了,如果没执行则等待delay(延迟时间),再次执行该任务。
一般情况下该文件不用修改,知道原理就可以。

总结:
1、如果你有很多任务需要每天|周|月重复执行,并且希望系统能自动把漏掉的任务补回来。那么你可以将你的脚本存放到系统相应的目录下面/etc/cron.{daily,weekly,monthly},并赋予可执行权限。
2、以上需要系统定时去调用的任务就叫系统级别的定时任务。


设定用户级别的定时任务
相关命令:
普通用户编辑自己的定时任务
crontab -e               <--- 编辑当前用户自己的定时任务(使用环境变量EDITOR指定的默认编辑器)
crontab -l               <--- 列出当前用户自己所有的定时任务
crontab -r               <--- 删除当前用户自己所有的定时任务


作为管理员,root可以设定/调整所有用户的定时任务,命令和上面类似,只是增加了一个-u <username> 的参数
crontab -e -u redhat        <--- 编辑指定用户的定时任务(使用环境变量EDITOR指定的默认编辑器)
crontab -l -u redhat        <--- 列出指定用户所有的定时任务
crontab -r -u redhat        <--- 删除指定用户所有的定时任务

说明:
1、crontab 默认调用的是vi编辑器,编辑计划任务的用法和vi一样。如果想自己定义编辑器,通过修改环境变量完成。如export EDITOR=vim
2、用户级别的任务定义当中,没有用户名那一栏,如果像定义系统级别的命令那样,输入用户名,crontab编辑器不会提示格式错误,但是任务不会得到正确的执行。

cron使用限制:

/etc/cron.deny          ——只拒绝哪些用户不能他用crontab,默认存在空文件
/etc/cron.allow         ——允许哪些用户使用crontab

如果同一个用户即在拒绝里又在允许里,默认允许优先。

思考2:如果我用crontab -e写了晚上8:30去关机,但是我18点下课就手动关机了,第二天来9点开机,它会不会延迟一段时间又关机呢?


作业:
备份etc目录,要求:
1. 每天4:00备份/etc目录到/var/back
00 04 * * *
mkdir /var/back
tar -czf /var/back/$(date +%F).tar.gz /etc
2. 将备份命令写在脚本中,如/root/back.sh,加执行权限
3. 每天备份的文件名包含当天的日期,如2016-11-09_etc.tar.gz
4. 计划任务执行时,屏幕不产生任何输出 
5. 只保留最近5天的备份 


vim /tmp/back.sh

#!/bin/bash
#判断该目录是否存在
dir=/var/back
if [ ! -d $dir ];then
    mkdir $dir
fi
#备份/etc目录
tar -czf $dir/$(date +%F).tar.gz /etc

#保留5天的备份文件
find $dir -mtime +5 -exec rm -f {} \;
或者
find $dir -mtime +5 |xargs rm -f

chmod +x /tmp/back.sh

# crontab -e
00 04 * * * /tmp/back.sh >/dev/null 2>&1
或者
00 04 * * * sh /tmp/back.sh &>/dev/null


周1和周4周日全量备份 0级别备份
2356 增量备份

凌晨130

/backup0.sh
/backup1.sh

oracle
30 01 * * 1 /backup0.sh
30 01 * * 2 /backup1.sh
30 01 * * 3 /backup1.sh
30 01 * * 4 /backup0.sh
30 01 * * 5 /backup1.sh
30 01 * * 6 /backup1.sh
30 01 * * 0 /backup0.sh


30 01 * * 1,4,0    /backup0.sh
30 01 * * 2,3,5,6  /backup0.sh







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值