计划任务:
让系统在将来的指定时间点执行某些任务(程序);任务可以周期性执行也可以仅仅执行一次。
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 —在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 --结束
实例:比较复杂的任务可以保存到脚本:
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 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个小时执行一次命令。
* 8,10 * * *
* * 2-8 * *
*/5 * * * *
00 10 5 * *
30 22 1 1 *
00 8,10,12 * * 1,3,5
00 8-12/2 * * 1,3,5
00 05 * * 1
02 8-20/3 * * 7|0
03 04 1,15 * *
以下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级别备份
2,3,5,6 增量备份
凌晨1:30
/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
计划任务
最新推荐文章于 2023-06-08 10:24:22 发布