概述:
什么是任务计划呢?就像我们每个人日常生活中都会使用到的闹钟一样,按时的去提醒该去做什么事情,以免忘记。同样,我们在工作当中也要在每天在特定的时间内安排做一些事情,这就是任务计划,本章将学习如何制定Linux系统的任务计划,这里主要包括两种工具:at 和 crontab。
任务计划介绍
任务计划的分类
一次性的任务计划:只执行一次就结束;
周期性的任务计划:每个一定的时间去做相同的事情;
任务计划使用的命令:
未来时间点执行一次任务:at,batch
周期性运行某任务:crontab
执行结果会通过邮件发送给用户
确定邮件服务器是否开启,执行 netstat -tnlp 或者 ss -tnlp 命令,查看25号端口
邮件服务
本地电子邮件服务:
smtp协议:simple mail transmission protocol 简单邮件传输协议;
pop3:Post Office Procotol 邮局协议;
imap4:Internet Mail Access Procotol 互联网邮件访问协议;
本地主机收发邮件:
MUA:Mail User Agent,用户收发邮件的工具程序;
☉mail 命令
语法:mail [-s 'SUBJECT'] username[@hostname]
邮件正文的生成
1)交互式输入:“.”号单独成行可以代表正文结束;Ctrl+d 提交亦可;
mail -s 'Hello root' root
2)通过输入重定向:
mail -s 'fstab file' root < /etc/fstab
3)通过管道
cat /etc/issue |mail -s 'issue file' root
1.发送邮件,输入标题,指明发送用户
2.切换到centos用户查收邮件
at 命令和 batch命令
at命令(未来时间点执行一次任务)
1)交互式 2)输入重定向 3) at –f 文件
依赖与atd服务,需要启动才能实现at任务
at队列存放在/var/spool/at目录中
CentOS 6:service atd {status|start};
CentOS 7:systemctl {status|start} atd
☉语法:
at [option] TIME
TIME:定义出什么时候执行这项任务
HH:MM [YYYY-mm-dd];
04:00 2016-09-20
规定在某年某月的某一天的特殊时刻进行该项任务
HH:MM[am|pm] [Month] [Date];
04pm March 17
17:20 tomorrow
noon, midnight(午夜), teatime(下午4点),tomorrow
now+#{minutes,hours,days, OR weeks}
HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某个时间点再加几个时间后才进行该项任务
如:now + 5 minutes
04pm + 3 days
at 的作业有队列,存放在/var/spool/at 中,用单个字母来表示,默认都使用 a 队列;
☉选项:
-q QUEUE:指明队列;
-l:列出指定队列中等待运行的作业;相当于atq;
-d #:删除指定作业号的作业;相当于atrm;
-c #:查看指定作业号的具体作业任务;
-v:可以使用较明显的时间格式列出at中的工作列表;
-f /path/from/somefile:从指定的文件中读取任务,不再交互式输入;(# at -f /testdir/at.txt)
-m:强制at发送邮件,表示执行完毕
注意:
作业执行命令的结果中的标准输出和错误以邮件通知给相关用户
[root@centos7 ~]# at now+2min # 设定计划任务,在2分钟后执行
at> cat /etc/issue
at> ls /var
at> echo "hello there."
at> <EOT> # 按 Ctrl+d 提交
job 1 at Fri Feb 24 15:49:00 2017
[root@centos7 ~]# at -l # 查看计划任务
1 Fri Feb 24 15:49:00 2017 a root
[root@centos7 ~]# at -f at.tasks now+5min #从指定文件中读取任务,不在交互式输入
job 2 at Fri Feb 24 16:08:00 2017
[root@centos7 ~]# at -l
2 Fri Feb 24 16:08:00 2017 a root
[root@centos7 ~]# atq
2 Fri Feb 24 16:08:00 2017 a root
[root@centos7 ~]# at -d 2 指明任务编号,删除任务 相当于atrm
[root@centos7 ~]# atq
[root@centos7 ~]# at -f at.tasks now+5min
job 3 at Fri Feb 24 16:09:00 2017
[root@centos7 ~]# atq
3 Fri Feb 24 16:09:00 2017 a root
[root@centos7 ~]# atrm 3
[root@centos7 ~]# atq
普通用户也可以执行at
/etc/at.{allow,deny} 控制用户是否能执行at任务
#白名单:
/etc/at.allow :默认不存在,只有该文件中的用户才能执行at命令;
#黑名单:
/etc/at.deny :拒绝该文件中的用户执行at命令,而没有在at.deny 文件中的用户则可以正常执行at命令。
注意:
白名单的优先级是大于黑名单的,如果一旦创建,则只有白名单中的用户才可以执行at命令,其他即使不在白
名单中的用户统统没有权限执行at命令;如果没有白名单,则只有黑名单起作用,此时,在黑名单中的用户是
不能执行at命令的,不在黑名单中的用户统统默认是允许执行at命令的;
如果两个文件都不存在,只有root 可以执行at 命令
batch命令
让系统自行选择空闲时间去执行此处指定的任务;
周期性计划任务:cron
1.cron介绍
服务程序相关的程序包
cronie:主程序包,提供crond守护进程及相关辅助工具;
cronie-anacron:cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任务在过去该
运行的时间点未能正常运行,则anacron会随后启动一次此任务;
crontabs:包含CentOS提供系统维护任务
确保crond守护进程(daemon)处于运行状态:
CentOS 7:systemctl status crond
CentOS 6:service crond status
使用命令
向crond提交作业的方式不同于at,他需要使用专用的配置文件,此文件有固定格式,不建议使用文本编
辑器直接编辑此文件,要使用crontab命令,可以检查语法是否有错误。
cron任务分为两类:
系统cron任务:
主要用于实现系统自身的维护;
手动编辑:/etc/crontab文件
用户cron任务:
命令 crontab
用cron执行的计划任务默认存放在:
日志:/var/log/cron
2.系统cron配置格式
系统cron的配置格式:/etc/crontab
注意:
1.每一行定义一个周期性任务;共7个字段
* * * * *:定义周期性时间;
user-name:运行任务的用户身份;
command to be executed:要执性的任务
2.此处的环境变量不同用户登录后获得的环境变量,因此,建议命令使用绝对路径,或者自定义的PATH
环境变量;
3.执性结果邮件发送给 MAILTO 指定的用户
3.用户cron配置格式
用户cron配置格式:
配置文件:/var/spool/cron/USERNAME
使用命令:crontab -e
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
# | | | | |
# * * * * * command to be executed
4.时间表示法
五个时间点分别是:分钟 小时 天 月 周几
特定值
给定时间点有效取值范围内的值;
注意:
day of week (周几)和 day of month (日)一般不同时使用;
*
给定时间点上有效取值范围内的所有值;表示“每..”(找时间点最小的 *)
示例:
* * * * * 默认每天每分钟执行
3 * * * *:每小时执行一次,每小时的第三分钟;
3 4 * * 5:每周执行一次,每周五的4点3分;
5 6 7 * *:每月执性一次,每月的7号6点5分;
7 8 9 10 *:每年执行一次,每年的10月9号8点7分;
离散取值:","
在时间点上使用逗号分割的多个值:#,#,#
示例:
9 8 * * 3,7:每周三和周日的8点9分;
0 8,20 * * 3,7:每周三和周日的8点和20点
连续取值:"-"
在时间点导航使用-连接开头和结束:#-#
示例:
0 9-18 * * 1-5:周一到周五(工作时间)内的每小时执行;
在指定时间点上,定义步长:
*/#:#即步长
注意:
指定的时间点不能被步长整除时,其意义将不复存在;
最小时间单位为“分钟”,想完成“秒”级任务,的需要额外借助其它机制;(即:定义成每分钟任务,而再
利用
脚本实现每分钟之内,循环执行多次;)
示例:
*/5 * * * *:每5分钟执行一次任务;
*/7:不能被整除,没有意义
预定义的时间格式
@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 * * * * 每小时
4.crontab 命令
crontab命令:
语法:
crontab [-u user] [-l | -r | -e] [-i]
选项:
-e:打开编辑界面定义任务;
-l:列出所有任务(仅是当前用户的所有任务);
-r:移除所有任务,即删除/var/spool/cron/USERNAME文件;
如果,删除单个任务应该通过编辑界面删除行实现;
-i:在使用-r选项移除所有任务时提示用户确认;
-u user:root用户可为指定用户管理cron任务(即为某个用户编辑计划任务);
注意:
运行结果以邮件通知给当前用户;如果拒接接收邮件:
COMMAND > /dev/null (执行成功发送给 /dev/null )
COMMAND &> /dev/null(不管执行成功和错误都直接发送给 /dev/null,慎用!!!)
定义COMMAND时,如果命令需要用到%,需要对其转义,但放置于单引号中的%不用转义亦可;
如:touch $(date +%Y-%m-%d-%H-%M-%S)
思考:
某任务在指定的时间因关机未能执行,下次开机会不会自动执行?
不会执行! 如果期望某时间因故未能按时执行,下次开机后无论是否到了相应时间点都要执行一次,可使
用 ancorn 命令;
如何在秒级别运行任务?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
# 定义周期性计划任务,直接使用 crontab -e 命令,会直接调用 vim 编辑器,并且会检查语法错误
例:
[root@centos7 ~]# crontab -e
crontab: installing new crontab
# 查看定义的计划任务
[root@centos7 ~]# crontab -l
*/5 * * * * /usr/sbin/ntpdate cn.ntp.org.cn > /dev/null
[root@centos7 ~]# crontab -l
*/5 * * * * /usr/sbin/ntpdate cn.ntp.org.cn > /dev/null
# 删除所有任务计划,如果只删除单个
[root@centos7 ~]# crontab -r
[root@centos7 ~]# crontab -l
no crontab for root
# 为 centos 用户创建计划任务,只有 root 有权限
例:
[root@centos7 ~]# crontab -u centos -e
no crontab for centos - using an empty one
crontab: installing new crontab
[root@centos7 ~]# ls /var/spool/cron/
centos root
[root@centos7 ~]# cat /var/spool/cron/centos
*/2 * * * * /bin/echo "hello everybody!"
# 查看当前用户的
[root@centos7 ~]# crontab -l
*/5 * * * * /usr/sbin/ntpdate cn.ntp.org.cn > /dev/null
# 查看centos用户的
[root@centos7 ~]# crontab -u centos -l
*/2 * * * * /bin/echo "hello everybody!"
[root@centos7 ~]# crontab -u centos -ri
crontab: really delete centos's crontab? y
[root@centos7 ~]# crontab -u centos -l
no crontab for centos
5.sleep 命令
sleep
用途
sleep命令常用于在Linux shell脚本中延迟时间。
语法:
sleep NUMBER [SUFFIX]...
☉SUFFIX(后缀):
s:秒, 默认;
m:分;
h:小时;
d:天
例:
[root@centos7 ~]# date;sleep 5;date
2017年 02月 25日 星期六 11:24:09 CST
2017年 02月 25日 星期六 11:24:14 CST
[root@centos7 ~]# date;sleep 1.5m;date
2017年 02月 25日 星期六 11:25:13 CST
2017年 02月 25日 星期六 11:26:43 CST
1、每4小时备份一次/etc目录至/backup目录中,保存的文件名称格式为“etc-
yyyy-mm-dd-HH”
# mkdir /backup
# crontab -e
0 */4 * * * /bin/cp -a /etc /backup/etc-`date + '%F-%H'` > /dev/null
2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”
# mkdir /logs
# crontab -e
# 20 1 * * 2,4,0 /bin/cp -a /var/log/messages /logs/messages-`date +'%Y%m%d'` > /dev/null
3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
# crontab -e
# 20 */2 * * * /bin/grep -e '^S' -e '^M' /proc/meminfo >> /tmp/meminfo.txt
4、工作日时间内,每两小时执行一次“ip addr show”命令
# crontab -e
# 0 9-17/2 * * 1-5 /sbin/ip addr show