在日常工作或使用计算机时,如果我们需要在某个时间执行某项任务,或在固定周期重复执行某项任务,我们需要对系统设定计划任务;在linux系统中,我们可以使用一次性计划任务at和batch命令,或者周期性计划任务crontab。
一、一次性任务执行:
1、命令格式:
#at [option] TIME
2、TIME格式:
特定时间:
HH:MM:其中HH为小时,MM为分钟。
MMDDYY,MM/DD/YY:其中MM是分钟,DD是第几天,YY是指年份。
now+UNIT:其中UNIT单位可以为minutes ,hours,days ,weeks。
模糊时间:
today,noon,midnight,teatime,tomorrow
3、at任务格式:
#at TIME
at> COMMAND
Ctrl+d:提交任务
at有作业队列:使用单个字母表示
at �l,atq: 查看作业队列中的待执行任务
at -d,atrm:删除任务。
任务作业执行完成后:结果会通过邮件通知给作业提交者
CentOS: 默认会安装并启动邮件服务,仅服务于本地系统;
#batch:功能同at,但无须为其指定时间,其会选择系统资源较空闲时执行指定的作业
二、 周期性任务执行:
1、安装并启动服务:
需要安装的程序包:crond
#yum install cronie
检查crond:
#/etc/init.d/crond status
如果状态信息为“is stopped”,则需要启动crond:
#/etc/init.d/crond start
检查crond开机启动:
#chkconfig �list crond
若为非开机启动需要设置开机启动crond:
#chkconfig crond on
2、cron任务分类:
系统cron:定义在/etc/crontab;
用户cron:定义在/var/spool/cron目录中,每个用户都有一个与用户名同名的文件,其功能类似于/etc/crontab。
3、crontab使用方法:
用户cron任务的定义方式:
crontab
-uusername:指定用户,无-u选项默认为当前用户。
-l:列出已经定义的所有任务
-e:打开编辑界面定义任务
-r:移除所有任务
#crontab-u USERNAME �e
/var/spool/cron/目录也只有root用户才可读写;普通用户可使用crontab -e命令编辑任务;
4、crontab格式:
执行#crontab -e,会出现vim编辑器进行任务编辑;
格式说明:
#vim /etc/crontab
格式:
cron在执行任务命令时需要指定环境变量,例如SHELL、PATH、HOME、MAILTO等;
左侧表示时间,右侧为执行的命令;
每行定义一个独立的任务:
时间:
时间由5个数字组成,分别表示:分钟(0-59)、小时(0-23)、日期(1-31)、月份(1-12)、星期(0-6)。
特殊符号:
*:任意数;
/#:每#个单位;
M�N:由M到N
A,B,C,…:A,B,C等多个数。
时间表示法:
(1)、每个时间位都应该使用其可用的有效取值范围内的值
3 * * * * | 17 3 * * * | 7 6 5 * * | 7 6 5 4 *
(2)、某个时间位上的*表示对应时间位的所有有效取值;
1 9 * * 3,每周三的9点1分。
(3)、*/#:在对应的时间位的有效取值上每#一次;
*/3 * * * *:每3小时;
0 */3 * * *:每3小时的整点;
*/8 * * * *:每8分钟 ;0-59:0, 8, 16, 24, 32, 40, 48, 56;
(4)、某个时间位上的连续区间:-
10-50/3 * * * *:由10分至50分之间,每3分钟执行;
(5)、离散取值:
1 7,9,13 * * *:7:01,9:01,13:01
命令:
如果定义在cron中的任务是脚本,此脚本中的各命令查找时遵循的是cron的PATH环境变量定义;因此,在命令行中测试无问题的脚本,在cron中未必;
解决方案:
命令使用绝对路径;在脚本中开始自己定义一个专用PATH环境变量。
如果在crontab的用户命令中使用%,得转义,使用\%的格式;不过,如果使用单引号引起来,也可不用转义;
5 3 * * * /bin/touch /tmp/testfile-$(date+\%F-\%H-\%M-\%S)
6 4 * * * /bin/touch /tmp/testfile-$(date+'%F-%H-%M-%S')
执行任务:
任务作业执行完成后:
每一次的执行结果会通过邮件通知给作业提交者;
丢弃邮件通知:
输出重定向:
> /dev/null
&> /dev/null
> /dev/null 2>&1
5、补充:
如何实现秒级别的任务:
每10秒钟:
* * * * * for i in {1..5}; do echo "howdy";sleep 10; done
0
10
20
30
50
0
anacron: crontab的补充机制:
检查有没有过去一个有效周期未曾执行的任务,如果有,在开机后的指定时间点执行一次。
本文出自 “” 博客,请务必保留此出处