Linux任务计划主要分为分为两种分别是一次性任务计划和周期性任务计划实现工具主要是at和crontab下面将详细介绍任务计划工具的使用。
1、at命令一次性任务计划
at命令是由atd服务提供的其主程序包是atd在CentOS6上可以使用service atd start命令来启动在CentOS7上需要使用systemctl start atd.service来启动服务。
at命令常用方法
at TIME:最简单的使用方法是at跟上时间以交互式的方法创建任务计划最后以Ctrl+d结束。
at -f FILE TIME:从指定文件中读取作业任务而不用再交互式输入
at -l:相当与atq列出系统上的所有当前用户的at队列
at -d job:相当于atrm可以删除一个指定的作业
at -c job:查看具体作业任务
at创建的任务都放在/var/spool/at目录下并且at作业任务的执行结果中如果有标准输出和错误输出则都是以邮件的形式通知给相关用户。
TIME的时间格式有
HH:MM:当天时间的几点几分执行任务如果该时间已过则明天此时执行任务还可以使用下面定义好的时间格式
noon:中午12点
midnight:凌晨即零点
teatime:下午茶时间具体为下午4点
HH:MM yyyy-mm-dd:某年某月某日的几点几分执行任务
HH:MM[am|pm] [Month] [Date]:同上也是指定具体某天的某时刻执行如04pm March 17
HH:MM tomorrow:明天的几点几分执行
now + # (minutes,hours,days,weeks):从现在时间起再加#分钟或#小时或#天或#周后执行
默认情况下所有用户都可以使用at命令创建一次性计划任务如果管理员需要控制具体那些用户可以使用at创建计划任务则可以通过黑名单拒绝或白名单允许的方式控制并且默认情况下系统自带有黑名单文件/etc/at.deny在其中填写不允许使用at命令的用户名单即可同理也可以手动创建白名单/etc/at.allow在其中填写允许用户的名单即可若黑名单和白名单同时存在则黑名单不生效只有白名单中的用户可以使用at命令创建任务。
2、batch命令一次性任务计划
batch创建的也是一次性任务计划和at的用法几乎一致但batch不需要指定时间batch会让系统自行选择空闲的时间去执行指定的任务。
3、crontab命令周期性任务计划
crontab命令需要crond守护进程提供服务其主程序包是cronie。通过crontab命令向crond提交计划任务与at不同它需要使用专用的配置文件且此文件具有固定格式。
cron任务分为两类一类是系统cron任务主要用于实现系统自身的维护而创建的周期性任务一般情况下系统任务是不需要手动添加的在安装系统时会自动创建如果需要新增系统任务的话可以手动编辑/etc/crontab文件。一类是用户cron任务根据用户需求自定义的周期性任务其创建方式可以使用crontab命令创建crontab命令创建任务时会自动检测语法错误且创建的任务配置文件会以用户名的方式自动保存在/var/spool/cron/目录下。
系统cron任务的格式为
# .—————- 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个字段前5个字段表示时间第6个字段表示以某用户身份运行第7个字段表示具体命令任务每一行表示一个周期性任务。
用户cron任务的格式与系统cron任务格式基本一致但用户cron任务不需要再指定以哪个用户身份运行了直接跟具体命令任务即可所以用户cron任务一共有6个字段。
cron任务的时间表示法:
1)、特定值给定时间点有效值范围内的值
2)、星号*表示特定时间点上有效值范围内的所有值表示“每…”
如:每年10月1号的中午12点表示为:0 12 1 10 *
每天的晚上18点表示为:0 18 * * *
每周一的早上点表示为:0 8 * * 1
3)、离散取值
如:每天的早上点和晚上18点表示为:0 8,18 * * *
每月的1号和15号表示为:0 0 1,15 * *
每周的周一和周五表示为:0 0 * * 1,5
4)、连续取值
如:每天的8点到18点表示为:0 8-18 * * *
每月的1号到15号表示为:0 0 1-15 * *
每周的周一到周五表示为:0 0 * * 1-5
5)、在指定时间范围上定义步长
如:每3分钟表示为:*/3 * * * *
每隔3天表示为:0 0 *3 * *
6)、系统定义好的时间
@reboot :每次重启后执行一次
@yearly和annually : 都表示为每年的1月1号:0 0 1 1 *
@monthly : 每月的1号 :0 0 1 * *
@weekly : 每周的周日 :0 0 * * 0
@daily :每天的凌晨:0 0 * * *
@hourly :每小时的整点:0 * * * *
crontab命令的常见用法有:
创建用户周期性任务命令为:crontab -e
列出所有用户周期性任务命令为:crontab -l
删除所有用户周期性任务命令为:crontab -r
root用户为指定用户创建或管理cron任务:crontab -u USER
cron任务也可以通过黑名单和白名单的方式控制用户使用crontab命令创建任务的权限默认情况下系统自带有黑名单/etc/cron.deny也可以手动创建白名单/etc/cron.allow当白名单和黑名单都存在时黑名单失效只有白名单中的用户可以使用crontab命令创建任务。
需要注意:
1)建议定义cron任务时所用到命令使用绝对路径或自定义一个拥有完整路径的环境变量。
2)cron任务的运行结果的标准输出和错误都是以邮件的形式通知给相关用户如果不想以邮件的形式通知用户则可以使用重定向的方式输出给/dev/nullCOMMAND &> /dev/null。
3)对于cron任务来讲%有特殊用途如果在命令中要使用%则需要转义不过如果将%放置与单引号中也可以不用转义。
练习
1、每周2, 4, 7备份/var/log/messages文件至/logs目录中文件名形如“messages-yyyymmdd”
#先创建/logs目录 ]# mkdir /logs #使用crontab -e创建任务 ]# crontab -e 0 0 * * 2,4,7 /bin/cp /var/log/messages /logs/messages-$(date +\%Y\%m\%d) &> /dev/null
2、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
]# crontab -e 0 */2 * * * /bin/grep "^[SM]" /proc/meminfo >> /tem/meminfo.txt
原创文章,作者:苦涩咖啡,如若转载,请注明出处:http://www.178linux.com/45373