At & Batch & Cron 

作为系统管理员,为了系统的安全我们希望服务器定期自动执行一些操作,比如每天自动备份系统文件,定期备份数据库,以及在未来某天让系统自动关机…………Linux下at & batch & cron能帮我们在未来某个特定时间让系统实现上述的操作,以及让系统定期执行某些操作。也就是下面的两类定期任务:
1)在未来的某个时间仅执行一次的任务
2)在未来周期性的执行一个任务
 
Linux系统下atd负责at从标准输入或者从指定的文件读取在未来执行的命令实习第一类任务,因此要先atd服务启动,当使用at定义
 
将要执行任务的同时就会以文本的方式把该任务写入/var/spool/at目录内等待atd服务执行;为了安全起见,并不是所有的用户都可以使用at定义任务的,linux环境下通过/etc/at.allow和/etc/at.deny这两个文件限制用户使用at的;默认情况系统只有/etc/at.deny这个文件并且为空(允许所有用户使用at);当/etc/at.allow和/etc/at.deny都存在时,at工作过程如下:
 (1)先寻找/etc/at.allow,只有写在这个文件的用户才有权限使用at命令
 (2)当/etc/at.allow不存在时,就寻找/etc/at.deny,写在该文件里面的用户不能使用at
 (3)当/etc/at.allow & /etc/at.deny都不存在,只有root可以使用at
at
# at [options] [time]
选项:
  -m      用email通知用户任务完成
  -f file 从某个定义的文件读取命令列表或脚本
  -l      查看任务队列 = atq
  -d sequ_num 删除at任务 = atrm sequ_num
时间表示法:
 (1)绝对时间
    HH:MM[AM|PM]
    HH:MM[AM|PM] MM/DD/YY
 (2)模糊时间
     [midnight|noon|teatime]
 (3)相对时间
    now + N
      minutes
      hours
      days
      weeks
用Ctrl+d 提交任务
eg1 # at 19:24 06/18/12 ##在12年06月18日 19点24分关机
    at>sync
    at>sync
    at>shutdown -h now 
eg2 # at 03:00am 
    at>cat /etc/fstab ##在凌晨3点查看/etc/fstab内容
eg3 # at -f usertest.sh now + 3 minutes ## 3分钟后执行usertest脚本
eg4 [# at -l | # atq ]  ##查看定义的任务列表
eg5 [# at -d 2 | atrm 2] ##删除任务队列里面的第二个任务
 
batch 定义的任务只在系统有空的时候才运行使用方法与at相同
 
在未来周期性执行一个任务是由cron服务来控制,该服务默认开启;分下面两类:
(1)用户:这类使用crontab来定义任务,定义完成后就会/var/spool/cron目录下创建一个与用户名相同的文件,与at一样为了安全起见crontab不允许说的用户使用该cron服务,也是通过/etc/cron.allow和/etc/cron.deny来限制用户
# crontab
  -e       ##编辑crontab,使用系统默认的编辑器
  -l       ##列出crontab
  -r       ##移除crontab(危险操作,删除/var/spool/cron/username文件)
  -u uname [-e|-l|-r] ##管理某个用户的crontab
 
(2)系统:该类通过编辑/etc/crontab配置文件来定义周期性任务,与用户定义的周期性任务不需要指定用户,而该类的必须指定用户
## /etc/crontab 内容
SHELL=/bin/bash  ##默认shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin ##执行文件的查找路径
MAILTO=root   ## 将输出结果通过email发给root
HOME=/
# run-parts (是个脚本)
01 * * * * root run-parts /etc/cron.hourly  ##凡是在/etc/cron.*的脚本会在对应的时间执行
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
/etc/crontab前5个字段定义时间
  minute:00-59  ##分钟
  hour: 0-23    ##小时
  day:  01-31   ##天
  month:01-12   ##月
  day of week:00-07 ##00和07 都表示星期日
 
10 * * * *  ##每小时任务
4 7 * * *   ##每天任务
4 8 9 * *   ##每月任务
23 18 * * 4 ##每星期任务
 
非连续时间点:
8,18 * * * * ##每小时的第8分钟和第18分钟执行一次,既是每10分钟执行一次
 
连续时间点:
8 8-18 * * * ##8到18点之间每小时的8分钟执行一次任务
 
*/n 每n执行一次
*/8 * * * *  ##每8分钟执行一次
8 */8 * * *  ##每8小时的8分钟执行一次
36 3 * * *  /bin/tar -jcf /tmp/backup.tar.gz /etc ##每天凌晨3点36备份/etc目录
注:用户和系统定义的任务无法读取用户的$PATH,所有要尽可能使用相应命令的绝对路径或者定义PATH

 anacron:仅是crontab的补充,每天、每周、每月检查crontab列表中在过去应该执行当没有正常执行的任务,系统开机后赶紧执行,执行结束后停止anacron服务;anacron默认是关闭的,只有用户在/etc/anacrontab定义任务后才能够启动anacron服务。