9.2 任务计划和周期性任务
任务计划和周期性任务
Linux 中定时执行的任务有任务计划和周期性任务两种,所谓任务计划即只在未来的某时间点执行一次某任务,周期性任务则是按照特定的时间规律定期执行某任务。本节我们就来讲解Linux 中这两种任务的实现方式。因为计划任务和周期任务的执行结果会通过邮件发送给用户,因此我们首先来简单说一下邮件服务。本节内容如下所示:
- 本地邮件服务和使用 mailx 收发邮件
- 任务计划:at 和 batch
- 周期性任务计划:cron
1. 本地邮件服务
上图是一个QQ邮箱用户编写一封邮件,发送给一个163邮箱用户,后者接收邮件并阅读的过程。其中
- smtp协议: 属于TCP/IP 上的应用层协议,完成跨网络传输邮件,是邮件服务器之间的传输协议
- pop3/imap4:
- 是客户端与邮件服务器之间的传输协议,定义了用户向服务商查询、分组、移动、编辑等方面的操作规范
- POP3是比较老的协议,而IMAP稍微新一点
mailx
mailx [-s 'SUBJECT'] username[@hostname]
- 作用: Mail User Agent, 用户收发邮件的工具程序;
- 收邮件: 不带参数使用 mailx 会进入命令行交互客户端,可用于接收邮件
- 发邮件:
-s 'SUBJECT'
: 指定邮件的主题username[@hostname]
: 指定收件人,本地传送无需域名- 附注: 默认进入交互式输入环境,填写邮件正文,也可通过输入重定向或管道指定
|
|
2. 任务计划
2.1 at命令
at [OPTION]... TIME
- 作用: 在 time 指定的时间运行特定命令,默认会进入交互式命令行,用于输入要执行的命令
- 选项:
-l
: 查看作业队列,相当于atq-f /PATH/FROM/SOMEFILE
: 从指定文件中读取作业任务,而不用再交互式输入;-d at_id
: 删除指定的作业,相当于atrm,后跟任务的 id 号,通过 atq 即可查看;-c
: 查看指定作业的具体内容;-q QUEUE
: 指明队列, at的作业有队列,用单个字母表示,默认都使用a队列;
- TIME:
HH:MM [YYYY-mm-dd]
: 指定具体的时间noon, midnight, teatime, tomorrow
: 使用特定的时间标识now+num[minutes, hours, days, OR weeks]
: 使用相对时间
|
|
2.2 batch命令:
batch 会让系统自行选择在系统资源较空闲的时间去执行指定的任务
3. 周期性任务计划:cron
3.1 cron 简介
|
|
周期性任务计划由 cronie 程序包提供,包括了 crond 守护进程及相关辅助工具。在定义周期性任务之前,首先需要确保crond守护进程(daemon)处于运行状态。centos7 和 centos6 检查服务运行状态的命令如下:
|
|
向crond提交作业的方式不同于at,它需要使用专用的配置文件,此文件有固定格式,不建议使用文本编辑器直接编辑此文件;要使用crontab命令。cron任务分为两类:
- 系统cron任务,主要用于实现系统自身的维护;需要手动编辑
/etc/crontab
文件进行任务配置 - 用户cron任务,可通过 crontab 命令,进行配置
3.2 系统cron的配置
系统 cron 的配置文件位于 /etc/crontab
,其内容如下。
|
|
周期性任务定义: 每一行定义一个周期性任务,共7个字段;
* * * * * user-name command to be executed
* * * * *
: 定义周期性时间user-name
: 运行任务的用户身份command to be executed
:要执行的任务
需要特别注意的,cron 周期性任务的执行环境跟用户登陆后的系统环境并不一样,cron 执行时默认的 PATH 为 /sbin:/bin:/usr/sbin:/usr/bin
,因此,建议命令使用绝对路径,或者在脚本中自定义PATH环境变量;
3.3 用户cron的配置
用户的 cron 配置文件位于 /var/spool/cron/USERNAME
与用户名同名的文件,其配置文件与系统 cron 配置文件类似,唯一的区别是在定义周期性任务时无需指明 user-name,默认是用户自己。建议使用 crontab 命令进行周期性任务的定义,因为其能自动检查语法错误,防止出错。
3.4 cron 中的时间表示法
* * * * *
周期性时间有如下定义方式:
- 特定值: 给定时间点有效取值范围内的值,day of week和day of month一般不同时使用;
*
: 给定时间点上有效取值范围内的所有值;表“每..”#,#,#
:逗号分隔的离散值#-#
: 短线连接开头和结束的连续取值:*/#
:在指定时间点上,定义步长,表示每隔多少的意思- 注意:
- 指定的时间点不能被步长整除时,其意义将不复存在;
- 最小时间单位为“分钟”,想完成“秒”级任务,得需要额外借助于其它机制;
|
|
3.5 crontab命令
crontab [-u user] [-l | -r | -e] [-i]
- 作用: 编辑用户 cron 配置文件
- 选项
-e
:编辑任务;-l
:列出所有任务;-r
:移除所有任务;即删除/var/spool/cron/USERNAME
文件;-i
:在使用-r选项移除所有任务时提示用户确认;-u user
:root用户可为指定用户管理cron任务;
- 通知:命令运行结果将以以邮件通知给当前用户;想拒收邮件可通过如下方式实现
COMMAND > /dev/null
: 命令正常运行不通知用户,运行出错则通知用户COMMAND &> /dev/null
: 无论命令是否正常运行均不通知用户
- 转义:定义COMMAND时,如果命令需要用到%,需要对其转义;但放置于单引号中的%不用转义亦可;
- 注意:
- 某任务在指定的时间因关机未能执行,下次开机不会自动执行
- 如果期望某时间因故未能按时执行,下次开机后无论是否到了相应时间点都要执行一次,可使用anacron实现
练习
|
|