在Linux中可以实现两种类型的定时任务,第一种是一次性的,执行一次后就不再执行了,比如你正在下载文件,还有10分钟才下载完,但是已经到周末下班时间了,你想让你的linux一个小时后关机。另外一种是循环执行的,比如你想每天早上6点准时发一封邮件给对面的女同事翠花,表示自己每天早睡早起身体好,但是自己却还在被窝睡懒觉。
这两种任务分别是at,batch和 crontab。

at:一次性的任务,可以指定具体的时间去执行。
batch:是在at的基础上执行的一个命令,一次性的任务,在cup负责小于0.8的时候执行。
crontab:循环任务,最小粒度为分中,指定时间后会每次系统到达这个时间点后执行。如 要在每天凌晨3点备份一下数据库。

at任务实现

命令格式:
root@study ~]# at [-mldv] TIME 
[root@study ~]# at -c工作号码
选项与参数:
-m :当at 的工作完成后,即使没有输出讯息,亦以email 通知使用者该工作已完成。
-l :at -l 相当于atq,列出目前系统上面的所有该使用者的at 排程;
-d :at -d 相当于atrm ,可以取消一个在at 排程中的工作;
-v :可以使用较明显的时间格式列出at 排程中的工作列表;
-c :可以列出后面接的该项工作的实际指令内容。

TIME:时间格式,这里可以定义出『什么时候要进行at 这项工作』的时间,格式有:
  HH:MM ex> 04:00
	在今日的HH:MM 时刻进行,若该时刻已超过,则明天的HH:MM 进行此工作。
  HH:MM YYYY-MM-DD ex> 04:00 2015-07-30
	强制规定在某年某月的某一天的特殊时刻进行该工作!
  HH:MM[am|pm] [Month] [Date] ex> 04pm July 30
	也是一样,强制在某年某月某日的某时刻进行!
  HH:MM[am|pm] + number [minutes|hours|days|weeks]
	ex> now + 5 minutes ex> 04pm + 3 days
	就是说,在某个时间点『再加几个时间后』才进行。

例子:

[root@study ~]# at now + 5 minutes   
at> /bin/mail -s "good morning cuicui" cuihua < /data/love.txt
at>   #在此处按 ctrl+d结束

这个任务会在5分钟后执行,发送了一封邮件给cuihua这个帐号,内容为/data/love.txt的内容。

batch与at的操作类似,不过batch不需要指定执行时间,他指定的任务会cpu负载小于0.8的时候执行。

[root@study ~]# batch 
at> /usr/bin/updatedb
at>
查看和关闭正在执行或等待执行的at任务
[root@study ~]# atq     列出正在执行或等待执行的at任务
3 Tue Aug 4 23:00:00 2015 a root
[root@study ~]# atrm 3  关闭上面这个任务
工作方式

at任务依靠的是atd这个服务来工作的,所以要确保这个服务已经开启。在我们下达at任务时候,会在 /var/spool/at 这个目录产生一个可执行文件,任务内容就在文件内,atd服务就会在指定时间去执行该文件。

crontab循环任务

使用crontab处理循环任务有三种方式,crontab、/etc/crontab, /etc/cron.d/*
ceontab:属于当前用户自己要执行的任务。编辑好的任务设计会在 /var/spool/cron/* 目录下有一个任务执行脚本。
/etc/crontab:当前文件就是系统任务。
/etc/cron.d/*:该目录用于存放自己开发任务,把这个任务放在该目录下也会定时被执行。

ceontab命令去编辑当前用户的定时任务

命令格式:

[root@study ~]# crontab [-u username] [-l|-e|-r] 
选项与参数:
-u :只有root 才能进行这个任务,亦即帮其他使用者建立/移除crontab 工作排程;
-e :编辑crontab 的工作内容
-l :查阅crontab 的工作内容
-r :移除所有的crontab 的工作内容,若仅要移除一项,请用-e 去编辑。

范例一:用dmtsai的身份在每天的12:00发信给自己 
[dmtsai@study ~]$ crontab -e 
#此时会进入vi的编辑画面让您编辑工作!注意到,每项工作都是一行。
0 12 * * * mail -s "at 12:00" dmtsai < /home/dmtsai/.bashrc 
#分时日月周|<==============指令串=== =====================>|

该任务和一行表示一个命令,分为6栏,分、时、日、月、周、命令
各个栏位的范围:

代表意义

分钟

小时

日期

月份


指令

数字范围

0-59

0-23

1-31

1-12

0-7

指令

特殊字符 代表意义
*(星号) 代表任何时刻都接受的意思!举例来说,范例一内那个日、月、周都是* , 就代表着『不论何月、何日的礼拜几的12:00 都执行后续指令』的意思!

,(逗号) 代表分隔时段的意思。举例来说,如果要下达的工作是3:00 与6:00 时,就会是:
0 3,6 * * * command
时间参数还是有五栏,不过第二栏是3,6 ,代表3 与6 都适用!

-(减号) 代表一段时间范围内,举例来说, 8 点到12 点之间的每小时的20 分都进行一项工作:
20 8-12 * * * command
仔细看到第二栏变成8-12 喔!代表8,9,10,11,12 都适用的意思!

/n(斜线) 那个n 代表数字,亦即是『每隔n 单位间隔』的意思,例如每五分钟进行一次,则:
/5 * * * * command
很简单吧!用
与/5 来搭配,也可以写成0-59/5 ,相同意思!

修改/etc/crontab,加入系统任务
[root@study ~]# cat /etc/crontab 
SHELL=/bin/bash                      <==使用哪种shell介面 
PATH=/sbin:/bin:/usr/sbin:/usr/bin   <==执行档搜寻路径 
MAILTO=root                          <==若有额外STDOUT,以email将资料送给谁

# 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
加入自定义的任务到/etc/cron.d/

以下是每小时执行任务的写法

[root@study ~]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly

值得注意的是,周与日月不可同时并存

当时间过去了,但是任务没有被执行(期间宕机了),重新执行过去的任务 anacron