Linux任务计划,周期性任务执行
- 未来的某时间点执行一次某任务:at,batch
- 周期性执行某任务:crontab
- 以上两种的执行结果会通过邮件发送给用户(本地邮件服务,非互联网)
-
- 检测邮件服务是否开启
- ss -tnlp
- 或者netstat -tnlp
- 如果存在127.0.0.1:25(IPV4)/::1:25(IPV6)则说明邮件服务已经开启
- 检测邮件服务是否开启
本地电子邮件服务
- 协议
- smtp:simple mail transmission protocal/简单邮件传输协议,应用层协议,只能发邮件不能收邮件
- pop3:post office protocal/邮局协议
- imap4:internet mail access protocal/互联网邮件访问协议
- mail/mailx命令
- 收发互联网邮件
- MUA:mail user agent,用户收发邮件的工具程序
- mail [-s "SUBJECT"] username[@hostname]
- "."号单独一行表示邮件结束了/或者ctrl+d
- mail命令不带任务参数表示收邮件
-
- 邮件正文的生成
- 交互式输入
- 通过输入重定向:mail -s "fstab file" root < /etc/fstab
- 通过管道:cat /etc/fstab | mail -s "fstab file" root
- 邮件正文的生成
at命令:
- 在未来某个时间点执行一次任务
- at [OPTION]... TIME
- TIME:
- HH:MM [YYYY-mm-dd]
- noon, midnight, teatime(下午四点)
- HH:MM tomorrow now+#,例如at now+1min(简写minutes)
- Unit: minutes, hours, days, weeks
- ctrl+d提交命令
- at -l查看提交且未执行的at命令队列,相当于atq命令
- at的作业有队列,用单个字母表示,默认都使用a队列
- at -f FILE TIME:表示从指定文件中读取作业任务,不用再交互式输入
- at -d #:删除未执行的某个作业任务,相当于atrm
- at -c #:查看某个作业任务的详细信息,包括执行环境(默认的at执行环境路径可能不对,所以某些命令可能需要给出绝对路径)
- at -q QUEUE:指明队列
- 注:作业执行的结果以邮件发送给提交作业的用户
batch命令:
- batch会让系统自行选择在系统资源较空闲的时间去执行指定的任务
周期性任务计划:cron
- 服务程序
- cronle:主程序包,提供了crond守护进程及相关辅助工具
- 确保crond守护进程(daemon)处于运行状态
- systemctl status crond[.service]/CentOS 7
- service crond status/CentOS 6
- 向crond提交作业的方式不同于at,它需要使用专用的配置文件,此文件有固定格式,不建议使用文本编辑器直接编辑此文件,要使用crontab命令
- cron任务分为两类
- 系统cron任务:主要用于实现系统自身的维护
- 只能手动编辑/etc/crontab文件
- 用户cron任务:
- 命令:crontab
- 系统cron任务:主要用于实现系统自身的维护
- 系统cron的配置格式
- cron任务分为两类
-
-
- 配置文件位置:/etc/crontab
- 每一行定义一个周期性任务,共7个字段
- * * * * *:表示定义周期性时间
- user-name:运行任务的用户身份
- command to executed:要执行的任务
-
-
-
- 此处的环境变量不同于用户登录后获得的环境变量,因此建议命令使用绝对路径,或者自定义PATH环境变量
- 执行结果邮件发送给MAILTO指定的用户
- 用户cron的配置格式
-
- 配置文件位置:/var/spool/cron/USERNAME
- 每一行定义一个周期性任务,不需要指定用户名,共6个字段
- 此处的环境变量不同于用户登录后获得的环境变量,因此建议命令使用绝对路径,或者自定义PATH环境变量
- 邮件发送给当前用户
-
- 时间表示法
- 特定值:给定字段处有效取值范围内的值
- 注:day of week和day of month一般不同时使用
- 如果不设置某时间字段,保留*号通配符
- 例如:3 * * * *:每小时的第三分钟执行一次
- 例如:3 4 * * 5:每周五的四点三分执行一次
- *:每
- 离散取值:在给定时间段上使用逗号分隔的多个值,没有空格
- 例如:9 8 * * 3,7:每周三和周日的八点九分执行一次
- 连续取值:在给定时间段上使用-连接开头和结束
- 例如:0 9-18 * * 1-5:工作时间
- 定义步长:/#
- */5 * * * *:每5分钟执行一次
- 当时间段最大值不能被整除时,其意义将不复存在
- 最小时间单位是分钟,想完成秒级任务需要借助于其它机制实现,例如在脚本中秒级循环执行
- 特定值:给定字段处有效取值范围内的值
- 时间表示法
- crontab命令
- -e:编辑任务(直接用vim编辑文件没有语法检查)
- -l:列出所有任务
- -r:移除所有任务,即删除/var/spool/cron/USERNAME文件;如果只想删除某一个任务,-e编辑(#号注释)
- -i:在使用-r的时候提示用户确认
- -u USER:root用户可以为其他用户管理cron任务,例如:crontab -u gentoo -l
- 注:百分号有特殊意义,需要转义;单引号中的百分号不需要转义
- 例如:touch $(date +%F-%H-%M-%S)
注:如果不想接受邮件,可以在每个任务命令后面输出重定向:
- COMMAND > /dev/null(错误流输出还是会发邮件的)
- COMMAND &> /dev/null,错误也不收邮件
注:如果在指定时间点上关机未执行,下次开机不会自动执行;如果想下次开机自动执行,可以使用anacron实现
练习: