Linux的计划任务有两种:
1. at:可以处理仅执行一次就结束的任务,要执行at必须要有atd服务的支持
2. crontab:重复执行的任务,要有cron(crond)服务的支持。除了可以使用指令执行外,还可以通过编辑/etc/crontab来进行
Linux常见的计划任务:
1. 登陆档的轮替(log rotate):因为Linux会一直记录系统的信息,所以登陆文件会越来越大,因此需要对其进行管理。这是系统必要的例行任务
2. 登陆文件分析(logwatch):绝大部分的错误信息都会被记录到登陆文件中,通过logwatch来主动分析登录信息
3. 建立locate数据库:locate指令是通过已存在文件名的数据库来进行查询(数据库在/var/lib/mlocate/中),需要对数据库进行例行更新
4. whatis数据库的建立:类似locate,whatis也是数据库,也是通过计划任务自动执行
5. RPM软件登陆文件的建立:RPM是一种软件管理的机制,系统会将文件名的更动信息进行记录
6. 移除暂存档:系统通过计划任务删除暂存档
7. 分析与网络服务有关的行为
at指令:
启动atd服务:/etc/init.d/atd restart
可以使用/etc/at.allow和/etc/at.deny这两个档案限制使用at指令的用户:
1. 先寻找/etc/at.allow档案,只有写在这个档案中的使用者才能使用at,没有的使用者不能使用at
2. 如果/etc/at.allow不存在,就寻找/etc/at.deny,写在这个档案中的用户不能使用at,不在这个档案中的用户则可以(一个账号一行)
3. 如果这两个档案都不存在,则只有root可以使用at指令
at [-mldv] TIME
at -c 工作号码
-m:当at工作完成后以email通知使用者
-l:相当于atq,列出目前系统上所有当前用户的at任务
-d:相当于atrm,取消一个已下达但尚未执行的at任务
-v:以明显的时间格式显示at任务
-c:列出后接at任务的实际指令内容
TIME:指定什么时候进行该项at任务,格式有
HH:MM,HH:MM YYYY-MM-DD,HH:MM[am/pm] [month] [day],HH:MM[am/pm] + number [minutes/hours/days/weeks]
最后一个表示指定日期后多久执行,此外时间也可是使用now
使用at时会进入一个at shell的环境来让用户下达指令,因此最好使用绝对路径来下达指令。at的执行与终端机环境无关,所有的stdout和stderr都会被送到执行者的mailbox;若想要在屏幕上显示,可以用数据流导向到/dev/tty[1/2...]
at的一个优点是背景执行,由于系统会通过atd使用另一个shell来执行工作,因此下达at工作后用户可以脱机交给Linux进行管理
batch:系统空闲时进行背景任务
batch其实是利用at来下达的,它会在系统平均负载小于1.5(Ubuntu)的时候才执行。Ubuntu下batch不能添加参数
计划任务
建立计划任务要使用crontab指令,与at相同,它有/etc/cron.allow和/etc/cron.deny两个档案限制crontab的使用者,不过如果这两个文件都不存在则任何用户都可以使用crontab指令
当用crontab建立计划任务后,该任务便会被记录到/var/spool/cron/crontabs/username中。注意不能直接用vim编辑这个档案,因为可能会因为输入语法错误导致cron无法执行。下达指令时,最好使用绝对路径
crontab [-u username] [-ler]
-u:帮其他用户建立/移除crontab计划任务,只有root才能执行
-e:编辑crontab的工作内容
-l:查询crontab的工作内容
-r:移除所有的crontab工作内容(如果只想移除一项请用-e进行编辑)
crontab内容:
crontab -e是针对使用者的cron来设计的,如果要编辑系统的计划任务,可以编辑/etc/crontab这个档案。注意,/etc/crontab是一个纯文本文档,而crontab指令其实是/usr/bin/crontab这个执行档。因为cron服务的最低侦测限制是分钟,所以cron会每分钟去读取一次/etc/crontab与/var/spool/cron/crontabs中的数据。理论上,应该编辑完/etc/crontab并存储离开后cron的设定就会自动执行,但由于在某些原因或某些系统下,crontab是读取到内存中的,所以cron可能不会马上执行,这时候通过【/etc/init.d/crond restart】重新启动crond服务即可
/etc/crontab中的run-parts是一个bash script,这条指令会执行后接目录中的所有档案。/etc/crontab档案中支持两种下达指令的方式:
1. 直接下达指令,如:01 * * * * root mail -s "testing" root
2. 目录规划,可以建立一个目录(如mycron),将要执行的计划任务写到该目录下,如:*/5 * * * * xero run-parts ~/mycron
注意可以分别以周或日月为单位进行循环,但不可以同时使用“几月几号且为星期几”的模式进行工作(周与日月不可同时存在)。另外,使用cron安排计划任务时,要注意一些使用方面的特性,如不要让所有任务在同一时间运行,可以列出不同的运行时间
如:1,6,11,16,21 * * * * root command (注意逗号之间不要有空格)
anacron
anacron是一个程序而非一个服务,它并不是用来取代crontab的,而只是为了处理非24小时开机Linux系统的crontab任务。所以anacron并不能指定何时执行某项任务,而是以天为单位或是在开机后立刻进行anacron的动作。它会侦测停机期间应该进行但没有进行的crontab任务并执行,完成后就停止
anacron会分析现在的时间与时间记录文件(timestamps)所记载的上次执行anacron的时间,比较后便可得知crontab是否被执行
anacron [-sfnu] [job]
-s:开始连续执行各项工作,会根据时间记录文件的数据判断是否进行
-f:强制进行,不理会时间记录文件
-n:立刻进行未进行的任务,而不延迟等待时间
-u:仅更新时间记录文件的时间戳,不进行任何工作
/etc/cron.daily/0anacron仅进行时间戳的更新,而未进行任何anacron动作。anacron其实是开机完成后才进行的工作任务,为了防止anacron误判时间参数,因此/etc/cron.daily/中的anacron才会在档名之前加0来保证能最先执行,就是为了先更新时间戳以避免anacron误以为crontab尚未进行任何工作。
/etc/anacrontab中的字段内容依次为:重复天数,延迟时间(分钟),工作名称定义,实际要进行的指令
若下达【anacron -s cron.daily】,会这样执行:
1. 由/etc/anacrontab分析cron.daily这项工作的天数为每1天
2. 由/var/spool/anacron/cron.daily得到最近一次执行anacron的时间戳
3. 将上个步骤得到的时间戳与当前时间比较,若差异天数大于等于1天,就准备执行指令
4. 根据设定,延迟一定的分钟后执行后续指令串(即run-parts那部分)
5. 执行完毕后,anacron程序结束
由此可见,时间戳非常重要,因为anacron是通过比较时间戳记录与目前的时间差,来判断是否进行某项工作