计划任务:shell
让系统在未来的指定时间点执行某些任务(程序);任务能够周期性执行也能够仅仅执行一次。vim
Linux系统中计划任务:at和cron服务是操做系统内置的2个服务,默认状况是安装好的。bash
at服务:指定某个时间一次性执行某个任务,依赖于系统后台atd进程编辑器
cron服务:指定时间周期性执行某个任务,依赖于系统后台crond进程ide
做用: 计划任务主要是作一些周期性的任务,目前最主要的用途是按期备份数据工具
Schedule one-time tasks with at. 一次性调度执行 at
Schedule recurring jobs with cron. 循环调度执行 cron
Schedule recurring system jobs.
全部计划任务执行中的输出都会以邮件的方式发送给指定用户, 除非重定向ui
at任务计划:url
# rpm -q at at-3.1.10-43.el6_2.1.x86_64
# 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 --计划任务的文本文件保存目录
at:制定一个一次性计划任务 -l 列出at任务 等于atq -d 删除at任务 等于atrm -c 查看任务内容
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 ——在7月31日上午10点运行此job at 1am tomorrow ——明天上午1点运行此job at 4:00 2020-12-12 ——在2020-12-12日的凌晨4点执行 at -t 09201430 ——9月20日的下午2:30运行此job at -t 202009201430 ——2020年的9月20日的下午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 --结束 实例:比较复杂的任务能够保存到脚本:
at服务访问控制:spa
/etc/at.allow 做用:只容许文件里面出现的用户使用atd这个服务,若是这个文件存在,就不去考虑at.deny操作系统
/etc/at.deny 做用:只拒绝里面的用户使用atd这个服务, 若是at.allow不存在的时候,才生效
例1: [root@tianyun ~]# at now +1min --一分钟后执行 at> useradd uuuu at> <EOT> job 1 at Sat Mar 21 22:34:00 2015 [root@localhost~]# atq 3 Thu Mar 30 09:55:00 2017 a root [root@tianyun ~]# id uuuu 例2: [root@localhost~]# vim at.jobs ---建立一个文件,名字能够自定义 useradd u99 useradd u00 touch /`date +%F`.txt [root@localhost~]# at now +1min < at.jobs 一分钟后执行输入这个文件里面的命令并执行
当须要周期性的重复执行任务是可使用cron服务;该服务每分钟检查一次,并执行符合条件的任务
# service crond status # /etc/init.d/crond status
# 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/ 存放系统每小时须要执行的脚本
# 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 executed 前5个字段分别表示: 分钟:0-59 小时:0-23 日期:1-31 月份:1-12 星期:0-7(0表示周日或者7表示周日) 还能够用一些特殊符号: ,: 表示分割,间隔。如第二个*表示成 8,10,就表示8点和10点 -:表示一个段,如第二个*表示成 1-5,就表示1到5点 /n : 表示每一个n的单位执行一次,如第二个*表示成*/1, 就表示每隔1个小时执行一次命令。
00 02 * * * ls //天天2:00整 00 02 1 * * ls //每个月1号2:00整 00 02 14 2 * ls //每一年2月14号2:00整 00 02 * * 7 ls //每周日2:00整 00 02 * 6 5 ls //每一年6月的周五2:00整 00 02 14 * 7 ls //每个月14号2:00整 或者 每周日2:00整,这两个时间都执行 00 02 14 2 7 ls //每一年2月14号2:00整 或者 每周日2:00整,这两个时间都执行 00 02 * * * ls //天天2:00整 * 02 * * * ls //天天2:00中的每一分钟 * * * * * ls //每分钟执行ls * * 14 2 * ls //2月14号的每分钟 1440分钟 */5 * * * * ls //每隔5分钟 00 02 1,5,8 * * ls //每个月1,5,8号的2:00整 00 02 1-8 * * ls //每个月1到8号的2:00整
若是系统断电或者宕机,错过任务执行的时间,怎么办?
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(延迟时间),再次执行该任务。
通常状况下该文件不用修改,知道原理就能够。
总结:
一、若是你有不少任务须要天天|周|月重复执行,而且但愿系统能自动把漏掉的任务补回来,那么你能够将你的脚本放在系统响应的目录下面/etc/cron.{d{daily,weekly,monthly},并赋予可执行权限。
二、以上须要系统定时去调用的任务将就叫系统级别的计划任务。
经过至少2种方法指定一个周期性的计划任务:
一、stu01用户每周日和周三的凌晨5点04分在查看/etc/hosts文件内容并保存到/tmp/stu01文件中 04 05 * * 0,3 stu01 cat /etc/hosts >/tmp/stu01 vim 1.sh cat /etc/hosts >/tmp/stu01 04 05 * * 0,3 stu01 /root/1.sh 二、root用户往/tmp/stu01的文件里每隔2分钟追加当前的系统时间 */2 * * * * root date >>/tmp/stu01
相关命令:
普通用户编辑本身的定时任务 crontab -e <--- 编辑当前用户本身的定时任务(使用环境变量EDITOR指定的默认编辑器) crontab -l <--- 列出当前用户本身全部的定时任务 crontab -r <--- 删除当前用户本身全部的定时任务 做为管理员,root能够设定/调整全部用户的定时任务,命令和上面相似,只是增长了一个-u <username> 的参数 crontab -e -u redhat <--- 编辑指定用户的定时任务(使用环境变量EDITOR指定的默认编辑器) crontab -l -u redhat <--- 列出指定用户全部的定时任务 crontab -r -u redhat <--- 删除指定用户全部的定时任务 说明: 一、crontab 默认调用的是vi编辑器,编辑计划任务的用法和vi同样。若是想本身定义编辑器,经过修改环境变量完成。如export EDITOR=vim 二、用户级别的任务定义当中,没有用户名那一栏,若是像定义系统级别的命令那样,输入用户名,crontab编辑器不会提示格式错误,可是任务不会获得正确的执行。
* * * * * command or file.sh or run-parts /dir/ 说明: 一、若是执行脚本文件,那么须要有可执行权限,若是没有可使用bash|sh等指定一种解释器执行 二、若是run-parts,那么后面指定的目录里的全部脚本文件必需要有可执行权限 3、用户级别的计划任务,不须要指定username 四、普通用户不可以直接vim修改本身的计划任务文件(/var/spool/cron/username)
/etc/cron.deny ——只拒绝哪些用户不能他用crontab,默认存在空文件 /etc/cron.allow ——容许哪些用户使用crontab 若是同一个用户即在拒绝里又在容许里,默认容许优先。
若是我用crontab -e 写了晚上8:30去关机,可是我18点就手动关机了,次日来9点来开机,它会不会延迟一段时间又关机呢?
答案:不会
备份etc目录,要求: 1. 天天4:00备份/etc目录到/var/back mkdir /var/back tar -czf /var/back/$(date +%F)_etc.tar.gz /etc 00 04 * * * 2. 将备份命令写在脚本中,如/root/back.sh,加执行权限 vim /root/back.sh tar -czf /var/back/$(date +%F)_etc.tar.gz /etc chmod +x /root/back.sh 3. 天天备份的文件名包含当天的日期,如2016-11-09_etc.tar.gz 4. 计划任务执行时,屏幕不产生任何输出 00 04 * * * /root/back.sh &>/dev/null 5. 只保留最近5天的备份 find /var/back -ctime +5 -exec rm -f {} \; find /var/back -ctime +5 |xargs rm -f vim /root/bak.sh mkdir /var/back tar -czf /var/back/$(date +%F)_etc.tar.gz /etc find /var/back -ctime +5 -exec rm -f {} \; chmod +x /root/bak.sh crontabe: 00 04 * * * bash /root/bak.sh
#!/bin/bash dir=/var/back #判断备份的目录是否存在,若是不存在就建立它 [ ! -d $dir ] && mkdir $dir #备份/etc目录,使用tar工具 tar -czvf $dir/$(date +%F)_etc.tar.gz /etc #备份的文件只须要保留5天之内 find $dir -ctime +5 -exec rm -f {} \; crontabe: 00 04 * * * bash /root/bak.sh