1. 其实就是,预先设置,自动执行。有两类:at和crontab

 

  • at :at 是个可以处理仅执行一次就结束排程的指令,不过要执行 at 时, 必须要有 atd 这个服务 (第十八章) 的支援才行。在某些新版的 distributions 中,atd 可能预设并没有启动,那么 at 这个指令就会失效呢!不过我们的 CentOS 预设是启动的!
     
  • crontab :crontab 这个指令所设定的工作将会循环的一直进行下去! 可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外,亦可编辑 /etc/crontab 来支援。 至于让 crontab 可以生效的服务则是 crond 这个服务喔!

linux上常见的例行性任务有:

 

  • 进行登录档的轮替 (log rotate)
    Linux 会主动的将系统所发生的各种资讯都记录下来,这就是登录档 (第十九章)。 由于系统会一直记录登录资讯,所以登录档将会越来越大!我们知道大型档案不但占容量还会造成读写效能的困扰, 因此适时的将登录档资料挪一挪,让旧的资料与新的资料分别存放,则比较可以有效的记录登录资讯。这就是 log rotate 的任务!这也是系统必要的例行任务;
     
  • 登录档分析 logwatch 的任务
    如果系统发生了软体问题、硬体错误、资安问题等,绝大部分的错误资讯都会被记录到登录档中, 因此系统管理员的重要任务之一就是分析登录档。但你不可能手动透过 vim 等软体去检视登录档,因为资料太复杂了! 我们的 CentOS 提供了一只程式‘ logwatch ’来主动分析登录资讯,所以你会发现,你的 root 老是会收到标题为 logwatch 的信件,那是正常的!你最好也能够看看该信件的内容喔!
     
  • 建立 locate 的资料库
    在第七章我们谈到的 locate 指令时, 我们知道该指令是透过已经存在的档名资料库来进行系统上档名的查询。我们的档名资料库是放置到 /var/lib/mlocate/ 中。 问题是,这个资料库怎么会自动更新啊?嘿嘿!这就是系统的例行性工作所产生的效果啦!系统会主动的进行 updatedb 喔!
     
  • whatis 资料库的建立
    与 locate 资料库类似的,whatis 也是个资料库,这个 whatis 是与 man page 有关的一个查询指令,不过要使用 whatis 指令时, 必须要拥有 whatis 资料库,而这个资料库也是透过系统的例行性工作排程来自动执行的哩!
     
  • RPM 软体登录档的建立
    RPM (第二十三章) 是一种软体管理的机制。由于系统可能会常常变更软体, 包括软体的新安装、非经常性更新等,都会造成软体档名的差异。为了方便未来追踪,系统也帮我们将档名作个排序的记录呢! 有时候系统也会透过排程来帮忙 RPM 资料库的重新建置喔!
     
  • 移除暂存档
    某些软体在运作中会产生一些暂存档,但是当这个软体关闭时,这些暂存档可能并不会主动的被移除。 有些暂存档则有时间性,如果超过一段时间后,这个暂存档就没有效用了,此时移除这些暂存档就是一件重要的工作! 否则磁碟容量会被耗光。系统透过例行性工作排程执行名为 tmpwatch 的指令来删除这些暂存档呢!
     
  • 与网路服务有关的分析行为
    如果你有安装类似 WWW 伺服器软体 (一个名为 apache 的软体),那么你的 Linux 系统通常就会主动的分析该软体的登录档。 同时某些凭证与认证的网路资讯是否过期的问题,我们的 Linux 系统也会很亲和的帮你进行自动检查!

2.at

启动:


  1. [[email protected] ~]# /etc/init.d/atd restart 
  2. 正在停止 atd:                          [  确定  ] 
  3. 正在启动 atd:                          [  确定  ] 
  4.  
  5. # 再设定一下开机时就启动这个服务,免得每次重新开机都得再来一次! 
  6. [[email protected] ~]# chkconfig atd on 

我们使用 at 这个指令来产生所要运作的工作,并将这个工作以文字档的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与执行了

要对at指令进行限制,利用/etc/at.allow 与 /etc/at.deny这两个文件:

 

  1. 先找寻 /etc/at.allow 这个档案,写在这个档案中的使用者才能使用 at ,没有在这个档案中的使用者则不能使用 at (即使没有写在 at.deny 当中);
     
  2. 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个档案,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 档案中的使用者,就可以使用 at 咯;
     
  3. 如果两个档案都不存在,那么只有 root 可以使用 at 这个指令。

 

使用方法:


  1. [[email protected] ~]# at [-mldv] TIME 
  2. [[email protected] ~]# at -c 工作号码 
  3. 选项与参数: 
  4. -m  :当 at 的工作完成后,即使没有输出讯息,亦以 email 通知使用者该工作已完成。 
  5. -l  :at -l 相当于 atq,列出目前系统上面的所有该使用者的 at 排程; 
  6. -d  :at -d 相当于 atrm ,可以取消一个在 at 排程中的工作; 
  7. -v  :可以使用较明显的时间格式列出 at 排程中的工作列表; 
  8. -c  :可以列出后面接的该项工作的实际指令内容。 
  9.  
  10. TIME:时间格式,这里可以定义出‘什么时候要进行 at 这项工作’的时间,格式有: 
  11.   HH:MM             ex> 04:00 
  12.     在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此工作。 
  13.   HH:MM YYYY-MM-DD      ex> 04:00 2009-03-17 
  14.     强制规定在某年某月的某一天的特殊时刻进行该工作! 
  15.   HH:MM[am|pm] [Month] [Date]   ex> 04pm March 17 
  16.     也是一样,强制在某年某月某日的某时刻进行! 
  17.   HH:MM[am|pm] + number [minutes|hours|days|weeks] 
  18.     ex> now + 5 minutes ex> 04pm + 3 days 
  19.     就是说,在某个时间点‘再加几个时间后’才进行。 

 注意,使用at的时候要用命令的绝对路径,at 在运作时,会跑到当时下达 at 指令的那个工作目录

 at 的执行与终端机环境无关,而所有 standard output/standard error output 都会传送到执行者的 mailbox 去啦!所以在终端机当然看不到任何资讯。那如果想把信息echo到终端怎么办? 可以透过终端机的装置来处理!假如你在 tty1 登入,则可以使用‘ echo "Hello" > /dev/tty1 ’来取代。

at工作管理:


  1. [[email protected] ~]# atq 
  2. [[email protected] ~]# atrm (jobnumber) 
  3.  
  4. 范例一:查询目前主机上面有多少的 at 工作排程? 
  5. [[email protected] ~]# atq 
  6. 5       2009-03-17 23:00 a root 
  7. # 上面说的是:‘在 2009/03/17 的 23:00 有一项工作,该项工作指令下达者为  
  8. # root’而且,该项工作的工作号码 (jobnumber) 为 5 号喔! 
  9.  
  10. 范例二:将上述的第 5 个工作移除! 
  11. [[email protected] ~]# atrm 5 
  12. [[email protected] ~]# atq 
  13. # 没有任何资讯,表示该工作被移除了! 

 

batch:系统有空时才进行背景任务

其实 batch 是利用 at 来进行指令的下达啦!只是加入一些控制参数而已。这个 batch 神奇的地方在于:他会在 CPU 工作负载小于 0.8 的时候,才进行你所下达的工作任务啦!工作负载是值CPU 在单一时间点所负责的工作数量

 

 

3.crontab

也有/etc/cron.allow 和 /etc/cron.deny,但不存在atd当使用者使用 crontab 这个指令来建立工作排程之后,该项工作就会被纪录到 /var/spool/cron/ 里面去了,而且是以帐号来作为判别的喔!举例来说, dmtsai 使用 crontab 后, 他的工作会被纪录到 /var/spool/cron/dmtsai 里头去!但请注意,不要使用 vi 直接编辑该档案, 因为可能由于输入语法错误,会导致无法执行 cron 喔!另外, cron 执行的每一项工作都会被纪录到 /var/log/cron 这个登录档中,所以啰,如果你的 Linux 不知道有否被植入***时,也可以搜寻一下 /var/log/cron 这个登录档

语法:


  1. [[email protected] ~]# crontab [-u username] [-l|-e|-r] 
  2. 选项与参数: 
  3. -u  :只有 root 才能进行这个任务,亦即帮其他使用者建立/移除 crontab 工作排程; 
  4. -e  :编辑 crontab 的工作内容 
  5. -l  :查阅 crontab 的工作内容 
  6. -r  :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。 
  7.  
  8. 范例一:用 dmtsai 的身份在每天的 12:00 发信给自己 
  9. [[email protected] ~]$ crontab -e 
  10. # 此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。 
  11. 0   12  *  *  * mail dmtsai -s "at 12:00" < /home/dmtsai/.bashrc 
  12. #分 时 日 月 周 |<==============指令串========================>

一共有六个栏位:

例行工作安排

其中,周的0和7都代表礼拜天,当然,周和日月是不能同时存在的

 

例行工作安排

 

系统的设定档:/etc/crontab

 cron 这个服务的最低侦测限制是‘分钟’,所以‘ cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的资料内容 ’,因此,只要你编辑完 /etc/crontab 这个档案,并且将他储存之后,那么 cron 的设定就自动的会来执行了

这个文件的内容:


  1. [[email protected] ~]# cat /etc/crontab 
  2. SHELL=/bin/bash                     <==使用哪种 shell 介面 
  3. PATH=/sbin:/bin:/usr/sbin:/usr/bin  <==执行档搜寻路径 
  4. MAILTO=root                         <==若有额外STDOUT,以 email将资料送给谁 
  5. HOME=/                              <==预设此 shell 的家目录所在 
  6.  
  7. # run-parts 
  8. 01  *  *  *  *   root      run-parts /etc/cron.hourly   <==每小时 
  9. 02  4  *  *  *   root      run-parts /etc/cron.daily    <==每天 
  10. 22  4  *  *  0   root      run-parts /etc/cron.weekly   <==每周日 
  11. 42  4  1  *  *   root      run-parts /etc/cron.monthly  <==每个月 1 号 
  12. 分 时 日 月 周 执行者身份  指令串 

你可以把要执行的命令放到cron.hourly等目录下,也可以直接下达(最后面的格式)

注意,当有很多指令要例行执行时,需要合理安排资源,错开执行时间。

 

4.anacron

anacron 并不是用来取代 crontab 的,anacron 存在的目的是处理非 24 小时一直启动的 Linux 系统的 crontab 的执行!所以 anacron 并不能指定何时执行某项任务, 而是以天为单位或者是在开机后立刻进行 anacron 的动作,他会去侦测停机期间应该进行但是并没有进行的 crontab 任务,并将该任务执行一遍后,anacron 就会自动停止了。