Linux的计划任务(crontab)

来源:互联网 发布:监控端口号怎么查看 编辑:程序博客网 时间:2024/06/05 20:49

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是通过比较时间戳记录与目前的时间差,来判断是否进行某项工作


0 0
原创粉丝点击