博文参考
http://www.178linux.com/48784
http://www.178linux.com/48902
http://www.myhack58.com/Article/48/66/2017/85923.htm
计划任务
at:未来的某时间点执行一次任务
batch:系统自行选择空闲时间去执行此处指定的任务
cron:周期性运行某任务
at
at命令用于在指定时间执行命令。at允许使用一套相当复杂的指定时间的方法。它能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。 上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:now + count time-units,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。
标准使用格式:
at [-V] [-q queue] [-f file] [-mMlv] timespec…
at [-V] [-q queue] [-f file] [-mMkv] [-t time]
at -c job [job…]
atq [-V] [-q queue]
at [-rd] job [job…]
atrm [-V] job [job…]
batch
at -b
简化格式:
at [option] TIME
常用选项:
-V:在标准错误上输出版本号。
-q queue:使用指定的队列。一个队列用一个字母标定,有效的的队列标定的 范围是从a到z和从A到Z。at 的缺省队列是 a,batch 的缺省队列是 b。队列的字母顺序越高,则队列运行时越谦让(运行级别越低)。 指定的队列 "="保留给当前运行的作业所在的队列。 如果一个作业被提交到一个以大写字母标定的队列,则与提交到 batch 同样对待。如果给 atq 指定一个队列,则只显示在此指定 队列中的作业。
-m:当作业完成时即使没有输出也给用户发邮件。
-f /path/from/somefile:从指定的文件中读取任务
-l:显示待执行任务的列表;等同于atq。
-d:删除指定的待执行任务;等同于atrm。
-v:对于 atq, 显示完整的在队列中未被删除的作业,对于其他 命令,显示作业将要执行的时间。 显示的时间的格式类似于"1997-02-20 14:50",但如果设置了 POSIXLY_CORRECT 环境变量之后,格式类似于"Thu Feb 20 14:50:00 1996"。
-c:查看具体作业任务
注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户,并不会显示输出并且依赖于atd服务,需要启动才能实现at任务
at 时间格式
TIME:定义出什么时候进行 at 这项任务的时间
HH:MM [YYYY-mm-dd]
MMDD[CC]YY, MM/DD/[CC]YY, DD.MM.[CC]YY or [CC]YY-MM-DD
noon(中午), midnight(深夜), teatime(4pm)
today(今天)、tomorrow(明天)
now+#{minutes,hours,days, OR weeks}
例如:
HH:MM 02:00
在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
HH:MM YYYY-MM-DD 04:00 2016-09-20
规定在某年某月的某一天的特殊时刻进行该项任务
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某个时间点再加几个时间后才进行该项任务
now + 5 minutes
04pm + 3 days
1、三天后的下午5点执行/bin/ls
2、明天17点钟,输出时间到指定文件内
3、计划任务设定后,在没有执行之前我们可以用atq命令(等同at -l)来查看系统没有执行的工作任务
4、删除已经设置的任务 #atrm 4等同于at -d
5、显示已经设置的任务内容
at命令执行方式
交互式
输入重定向式
at 16:00 </root/a.sh
at -f 文件
at 16:00 -f /root/a.sh
相关目录和文件
/var/spool/at
/etc/at.allow
/etc/at.deny
/var/spool/at/spool
/proc/loadavg
/var/run/utmp
at任务队列存放在/var/spool/at目录中
/etc/at.{allow,deny}控制用户是否能执行at任务
白名单: /etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令
黑名单: /etc/at.deny 拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行
如果两个文件都不存在,只有 root 可以执行 at 命令
注意:/etc/at.{allow,deny}同时存在时白名单的优先级要高于黑名单;名单格式即为用户名例如:tom(注意:一行一个用户名)
周期性计划任务cron
相关的程序包:
cronie: 主程序包,提供crond守护进程及相关辅助工具
cronie-anacron: cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
crontabs:包含CentOS提供系统维护任务
确保crond守护处于运行状态:
区别
CentOS 7:
systemctl status crond
CentOS 6:
service crond status
crond服务
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
查看crontab服务状态:
service crond status
手动启动crontab服务:
service crond start
查看crontab服务是否已设置为开机启动,执行命令:
ntsysv
加入开机自动启动:
chkconfig –level 35 crond on
计划周期性执行的任务提交给crond,到指定时间会自动运行系统cron任务:系统维护作业
/etc/crontab
crontab命令
日志: /var/log/cron
计划任务
系统cron任务:/etc/crontab
注释行以 # 开头
详情参见 man 5 crontab
任务调度
Linux下的任务调度分为两类:系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
系统任务
前四行是用来配置crond任务运行的环境变量
第一行SHELL变量指定了系统要使用哪个shell,这里是bash;
第二行PATH变量指定了系统执行命令的路径;
第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户;
第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致,使用者权限文件如下:
/etc/cron.deny 该文件中所列用户不允许使用crontab命令;
/etc/cron.allow 该文件中所列用户允许使用crontab命令;
/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名;
crontab文件的含义:用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段
格式含义
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
user-name:以指定的用户身份运行任务
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
(1)特定值:表示指定时间点有效取值范围内的值
(2)星号():代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
(3)逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
(4)中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
(5)正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如/10,如果用在minute字段,表示每十分钟执行一次。
例如:
每3小时echo命令;
0 /3 centos /bin/echo "howdy!"
晚上9点10分运行echo命令;
10 21 * root /bin/echo "Howdy!"
时间格式
@reboot Run once after reboot. 重启后执行
@yearly 0 0 1 1 * 每年
@annually 0 0 1 1 * 每年
@monthly 0 0 1 每月
@weekly 0 0 0 每周
@daily 0 0 * 每天
@hourly 0 每小时
计划任务
系统的计划任务:
/etc/crontab
/etc/cron.d/ 配置文件
/etc/cron.hourly/ 脚本
/etc/cron.daily/ 脚本
/etc/cron.weekly/ 脚本
/etc/cron.monthly/脚本
crontab
crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。每一个用户拥有自己的crontab,配置文件存在/var下面,不能被直接编辑。
标准使用格式:
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
crontab -n [ hostname ]
crontab -c
简化格式:
crontab(选项)(参数)
选项
-e:编辑该用户的计时器设置;
-l:列出该用户的计时器设置;
-r:删除该用户的计时器设置;
-u<用户名称>:指定要设定计时器的用户名称。
参数
crontab文件:指定包含待执行任务的crontab文件。
知识扩展
Linux下的任务调度分为两类:系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
anacron
anacron系统任务运行计算机关机时cron不运行的任务, CentOS6以后版本取消anacron服务,由crond服务管理。
假设计算机没有一直开机,对笔记本电脑、台式机、工作站及其它不一直开机的系统很重要,对偶尔要关机的服务器很有用
配置文件:
/etc/anacrontab,负责执行/etc/ cron.daily、/etc/cron.weekly、/etc/cron.monthly中系统任务。
/etc/cron.hourly/由/cron.d/0hourly执行
字段1:如果在这些日子里没有运行这些任务……
字段2:在重新引导后等待这么多分钟后运行它
字段3:任务识别器,在日志文件中标识
字段4:要执行的任务
当执行任务时,更新/var/spool/anacron/中文件的时间戳
CentOS6使用/etc/cron.daily/tmpwatch定时清除临时文件
CentOS7使用systemd-tmpfiles-setup服务实现
配置文件:
/etc/tmpfiles.d/.conf
/run/tmpfiles.d/.conf
/usr/lib/tmpfiles/*.conf
/usr/lib/tmpfiles.d/tmp.conf
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
命令:
systemd-tmpfiles –clean|remove|create configfile
用户任务
用户cron
crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
使用
crontab -e #按/etc/crontab格式手动添加计划内容
查看计划任务
crontab -l
并且
crontab -e 产生的文件会生成并保存在/var/spool/cron/USERNAME中
crontab -r 删除计划任务
注意:计划任务的文件名必须和用户名相同才可以执行。
at和crontab
一次性作业使用 at
重复性作业使用crontab
Create —– at time crontab -e
List —– at -l crontab -l
Details —– at -c jobnum N/A
Remove —– at -d jobnum crontab -r
Edit N/A —– crontab -e
没有被重定向的输出会被邮寄给用户
根用户能够修改其它用户的作业
任务警告
注意:运行结果的标准输出和错误以邮件通知给相关用户
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
对于cron任务来讲, %有特殊用途;如果在命令中要使用%,则需要转义;不过,如果把%放置于单引号中,也可以不用转义
思考:
(1) 如何在秒级别运行任务?
for min in 0 1 2; do echo "hi"; sleep 20;
done
(2) 如何实现每7分钟运行一次任务?
sleep
暂停指定的秒数。时间单位可以是s 表示秒(默认设置),m 表示分钟,h 表示小时,d 表示天。 指定数字可以是一个整数,也可以是浮点数。
注意:如果参数个数超过2个,暂停的总时间为各个参数的值的和。
sleep NUMBER[SUFFIX]…
SUFFIX:
s: 秒, 默认
m: 分
h: 小时
d: 天
sleep后面的参数可以浮点数
例如:sleep 0.5
有时在写一些以循环方式运行的监控脚本,设置时间间隔是必不可少的,下面是一个Shell进度条的脚本演示在脚本中生成延时。(打印进度条)
usleep命令是sleep命令单位为微妙的运用
例如:usleep 1000000
1、每天的2点和12点整,将/etc备份至/testdir/backup目录中,保存的文件名称格式为“ etcbak-yyyy-mm-ddHH.tar.xz”
将下列代码添加至/etc/crontab中
2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“ messages-yyyymmdd”
将下列代码添加至/etc/crontab中
3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
将下列代码添加至/etc/crontab中
0 /2 cat /proc/meminfo | grep "^[SM]" >> /tmp/meminfo.txt
4、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报
将下列代码添加至/etc/crontab中
/10 1-5 . /root/bin/CiPanJinKong.sh
5、工作日时间内,对用户docker每小执行一次“ip addr show”命令;
切换至docker用户使用命令crontab -e进入编辑界面
加入"0 9-18 1-5 docker ip addr show"信息后保存退出
6、每4小时备份一次/etc目录至/backup目录中,保存的文件名称格式为“etc-yyyy-mm-dd-HH.tar.xz”;
在/etc/crontab文件中添加如下:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。