一、定时(计划)任务
1、概念:未来的某时间点执行一次某任务或者周期性的运行某个任务,执行结果会通过邮件的形式发送给用户
2、可将其分为两类:
(1)定点执行一次某任务:at,batch
(2)周期性的运行某任务:crontab
1.1 用户及系统定时任务
crond是Linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,可以使用命令:service crond status (CentOS6);systemctl status crond (CentOS7)进行查看。
crond进程定期(每分钟)检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。用户在cron表(也称为crontab文件)指定定时任务,crontab也就是常见的定时任务设置命令。Linux下的任务调度分为两类,系统任务调度和用户任务调度。
系统任务调度: 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。/etc/crontab文件就是系统任务调度的配置文件。
用户任务调度: 用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用crontab工具来定制自己的计划任务。所有用户定义的crontab文件被保存在/var/spool/cron目录中。
1.2 定时任务语法
先了解一下mail命令,因为我们所有的定时任务在执行结束后都会通过邮件通知。
使用mail发邮件时,必须先将sendmail服务启动。
mail -s “邮件主题” -c “抄送地址” -b “密送地址” -f 发送人邮件地址 -F 发件人姓名 < 要发送的邮件内容
1、at命令:
计划任务,在特定的时间执行某项工作,在特定的时间执行一次,需要安装at服务,apt-get install at
1、时间定义
hh:mm 12:00
midnight(深夜)noon (中午) teatime(饮茶时间,一般是下午4点)
AM PM 8am 9pm
2019-8-11 2019/8/11
+ 5 minutes hours days weeks
today tomorrow
2、语法结构
at 选项 参数
-q:列出任务
-f :从文件中读取
-l :列出任务
-d:指定删除
-v:列出已执行未删除的任务
-V:印出版本编号
-c:查看作业内容
at:在特定的时间执行一次性的任务
atq:列出用户的计划任务
atrm:根据任务号删除at任务
batch:在系统负荷允许的情况下执行at任务,即在系统空闲的情况下才执行at任务
3、示例:
[root@localhost ~]# at now +3 minutes #3分钟后执行
at> echo “hello” #输入任务
at> #Ctrl+D会直接退出
job 1 at 2019-08-06 15:58
[root@localhost ~]# atq #查看待处理作业
1 2019-08-06 15:58 a root
[root@localhost ~]# at now +7 minutes #7分钟后执行
at> echo “hello”
at>
job 2 at 2019-08-06 16:03
[root@localhost ~]# atq #查看待处理作业
2 2019-08-06 16:03 a root
1 2019-08-06 15:58 a root
[root@localhost ~]# atrm 2 #删除待处理作业
[root@localhost ~]# at -c 3 #根据作业ID查看作业内容
#!/bin/sh
#atrun uid=0 gid=0
#mail root 0
umask 22
HOSTNAME=localhost.localdomain; export HOSTNAME
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
cd /root || {
echo ‘Execution directory inaccessible’ >&2
exit 1
}
${SHELL:-/bin/sh} << ‘marcinDELIMITER63bd06f2’
echo “world”>1.txt
marcinDELIMITER63bd06f2
2、cron命令
1、在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
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
每行定义一个周期性任务,共7个字段;
#用户任务调度:用户定期要执行的工作。可以使用crontab工具来定制自己的计划任务。所有用户定义的crontab文件被保存在/var/spool/cron目录中。其文件名与用户名一致。
示例:
5 * * * * 每小时的第五分钟执行一次
3 4 * * 5 每周的4时3分执行一次
5 6 7 * * 每月的7号的6时5分执行一次
7 8 9 10 * 每年10月9日8时7分执行一次
*/5 * * * * 每隔五分钟执行一次
2、crontab命令
service crond start:启动服务
service crond stop:关闭服务
service crond restart:重启服务
service crond reload:重新载入配置
service crond status:启动服务
选项:-e:编辑任务
-l:列出所有任务
-r:移除所有任务
-i:在使用-r选项移除所有任务时提示用户确认
-u user:root用户可为指定用户管理cron任务
3、计划任务规范:
1、脚本要规范,脚本存放位置要规范,便于维护
2、定时任务要写注释
3、执行的脚本要带绝对路径
4、执行结果的标准输出或者错误输出 >/dev/null
5、可以以命令完成的任务,也要写在脚本
6、分用户执行