linux计划任务、周期性任务执行
未来的某时间点执行一次某任务:at,batch
周期性运行某任务:crontab
执行结果: 会通过邮件发送给用户, 存放在/var/spool/mail/UserName
~]# ss -tnl 或者 ~]# netstat -tnlp 查看是否有25号端口打开,来判断本机的邮件服务是否正常打开
本地电子邮件服务:
smtp协议: simple mail transmission protocol,简单邮件传递协议
pop3: post office protocol
imap4: internet mail access protocol
mail命令:
mailx – send and receive Internet mail (CentOS 7)
MUA: Mail User Agent, 用户收发邮件的工具程序
mailx [-s 'SUBJECT(标题)'] UserName[@hostname]
邮件正文的生成:
(1) 交互式输入, . 单独成行可以表示正文结束, ctrl + d提交亦可
(2) 通过输入重定向
(3) 通过管道
at 命令
需要atd服务启动
/var/spool/at
at [option]… [TIME]
TIME:
HH:MM[YYYY-mm-dd]
noon: 中午
midnight: 午夜
teatime: 下午4点
tomorrow: 明天
now + #: 指定从现在延迟多久后执行作业任务
UNIT(单位): minutes, hours, days, weeks
at的作业有队列, 用单个字母表示, 默认都使用a队列
常用选项:
-l: 查看作业队列, 相当于atq
-f /Path/From/File: 从文件中读取作业任务, 而不用再交互式输入
-d #: 删除指定号码的任务, 相当于atrm #
-c #: 查看指定号码的作业的具体内容
-q QUEUE: 指明队列
注意: 作业的执行结果是以邮件发送给提交作业的用户
/etc/at.allow文件比/etc/at.deny文件的优先级高
batch 命令
batch会让系统自行选择在系统资源较空闲的时间去执行指定的任务
周期性任务计划: cron
/var/spool/cron/username
需要服务程序始终处于运行状态:
cronie: 主程序包, 提供了crond守护进程及相关辅助工具
/etc/cron.allow和 /etc/cron.deny
确保crond守护进程(daemon)处于运行状态;
CentOS 7: systemctl status crond.service
CentOS 6: service crond status
向crond提交作业的方式不同于at, 需要使用专用的配置文件, 并且此文件有固定格式, 不建议使用文本编辑器直接编辑此文件, 要使用crontab命令
crond任务分为两类
系统crond任务: 主要用于实现系统自身的维护
手动编辑: /etc/crontab 文件
用户crond任务:
命令: crontab 命令
系统cron的配置格式:
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
# | | | | |
# * * * * * user-name command to be executed
注意:
(1)每一行定义一个周期性任务, 共七个字段
* * * * *: 定义周期性时间
user-name: 运行任务的用户的身份
command to be executed: 要执行的任务
(2)此处的环境变量不同于用户登录后获得的环境变量, 因此, 建议命令使用决定路径, 或者自定义环境变量PATH
(3) 执行结果邮件发送给MAILTO指定的用户
用户crond的配置格式
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
注意:
(1) 每行定义一个cron任务, 共6个字段, 没有用户名
(2)此处的环境变量不同于用户登录后获得的环境变量, 因此, 建议命令使用决定路径, 或者自定义环境变量PATH
(3) 邮件发送给当前用户
时间表示法:
(1) 特定值
给定时间点有效取值范围内的值;
注意: day of week和day of month一般不同时使用
(2) *
给定时间点上有效取值范围内的所有值; 表示"每…"
(3) 离散取值: ,
在时间点上使用逗号分隔的多个值
#,#,#
(4) 连续取值: –
在时间上使用 – 连接开头和结束
#-#
(5) 在指定时间点上, 定义步长: /
*/#: #即步长
*/2:
注意:
(1)指定的时间点不能被指定的步长整除时, 其意义将不存在
(2) 最小时间单位为"分钟", 想完成"秒"级任务, 需要额外借助于其他机制
定义成每分钟任务: 再利用脚本实现在每分钟之内, 循环执行多次
示例:
(1) 3 * * * *: 每小时的第3分钟执行
(2) 3 4 * * 5: 每周五的 4:03 执行
(3) 5 6 7 * *: 月任务, 每月7号的 6:05执行
(4) 7 8 9 10 *: 年任务, 每年的10月9日8:07执行
(5) 9 8 * * 3,7: 每周三、日的8:09执行
(6) 0 8,20 * * 3,7: 小于指定时间点的时间要给与一个时间点
(7) 0 9-18 * * 1-5:
(8) */5 * * * *: 每5分钟执行一次某任务
crontab 命令:
crontab [-u user] [-l | -r | -e] [-i] [-s]
-e: 编辑任务, 自动调用编辑器打开模板文件
-l: 列出自己的所有任务
-r: 移除所有任务, 即删除crontab文件/var/spool/cron/USERNAME文件;
-i: 交互式删除任务, 配合 -r 选项使用
-u user: root用户可为指定用户指定计划任务
注意: 运行结果以邮件通知当前用户; 如果拒绝接收邮件
(1) COMMAND > /dev/null: 只发送错误邮件
(2) COMMAND &> /dev/null
注意: 定义COMMAND时, 如果命令需要用到 %, 需要对其转义; 但放置于单引号中的 %不用转义
如果某任务在指定的时间因关机未能执行, 下次开机不会自动执行, 如果期望下次开机后无论是否到了相应时间点都要执行一次, 可使用anacron实现
原创文章,作者:black_fish,如若转载,请注明出处:http://www.178linux.com/47269