Cron是Linux系统中最有用的工具之一,cron作业是在指定时间到来时被调度执行的作业。
最常见的自动化系统管理和自动维护工作,比如每天发出的按计划完成了备份的通知,或者是按计划定时清理/tmp/目录的通知。还有很多Web应用程序也需要执行定时作业。到时间吃饭了发送一封邮件通知你可以吃饭了,通知你比赛开始了等等
Linux 上常见的例行性工作
1.进行登录档的轮替 (log rotate):
Linux 会主动的将系统所发生的各种资讯都记录下来,这就是登录档 。
由於系统会一直记录登录资讯,所以登录档将会越来越大!我们知道大型文件不但占容量还会造成读写效能的困扰,
因此适时的将登录档数据挪一挪,让旧的数据与新的数据分别存放,则比较可以有效的记录登录资讯。这就是 log rotate
的任务!这也是系统必要的例行任务;
2.登录档分析 logwatch 的任务:
如果系统发生了软件问题、硬件错误、资安问题等,绝大部分的错误资讯都会被记录到登录档中,
因此系统管理员的重要任务之一就是分析登录档。但你不可能手动透过 vim 等软件去检视登录档,因为数据太复杂了!
我们的 CentOS 提供了一只程序『 logwatch 』来主动分析登录资讯,所以你会发现,你的 root 老是会收到标题为 logwatch
的信件,那是正常的!你最好也能够看看该信件的内容喔!
3.创建 locate 的数据库:
在第七章我们谈到的 locate 命令时,
我们知道该命令是透过已经存在的档名数据库来进行系统上档名的查询。我们的档名数据库是放置到 /var/lib/mlocate/ 中。
问题是,这个数据库怎么会自动升级啊?嘿嘿!这就是系统的例行性工作所产生的效果啦!系统会主动的进行
updatedb 喔!
4.whatis 数据库的创建:
与 locate 数据库类似的,whatis 也是个数据库,这个 whatis 是与
man page 有关的一个查询命令,不过要使用 whatis 命令时,
必须要拥有 whatis 数据库,而这个数据库也是透过系统的例行性工作排程来自动运行的哩!
5.RPM 软件登录档的创建:
RPM 是一种软件管理的机制。由於系统可能会常常变更软件,
包括软件的新安装、非经常性升级等,都会造成软件档名的差异。为了方便未来追踪,系统也帮我们将档名作个排序的记录呢!
有时候系统也会透过排程来帮忙 RPM 数据库的重新建置喔!
6.移除缓存档:
某些软件在运行中会产生一些缓存档,但是当这个软件关闭时,这些缓存档可能并不会主动的被移除。
有些缓存档则有时间性,如果超过一段时间后,这个缓存档就没有效用了,此时移除这些缓存档就是一件重要的工作!
否则磁碟容量会被耗光。系统透过例行性工作排程运行名为 tmpwatch 的命令来删除这些缓存档呢!
7.与网络服务有关的分析行为:
如果你有安装类似 WWW 服务器软件 (一个名为 apache 的软件),那么你的 Linux 系统通常就会主动的分析该软件的登录档。
同时某些凭证与认证的网络资讯是否过期的问题,我们的 Linux 系统也会很亲和的帮你进行自动检查!
cron工作介绍
1./etc/cron.deny和 /etc/cron.allow
为了安全性的问题, 我们可以限制使用 crontab 的使用者帐号喔!
/etc/cron.allow:
将可以使用 crontab 的帐号写入其中,若不在这个文件内的使用者则不可使用 crontab;
/etc/cron.deny:
将不可以使用 crontab 的帐号写入其中,若未记录到这个文件当中的使用者,就可以使用 crontab 。
2.crontab语法
[[email protected] ~]# crontab [-u username] [-l|-e|-r] 选项与参数: -u :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程; -e :编辑 crontab 的工作内容 -l :查阅 crontab 的工作内容 -r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。
(1)基本上所有的Linux发行版在默认情况下都预安装了cron工具。即使未预装cron,也很简单,执行命令手动安装它:
[email protected]:~# apt-get install cron
(2)接着检查cron服务的状态,默认情况它应该运行于后台。如果它未启动,那么可以手动启动此服务。
[email protected]:/var/log$ sudo service cron status
cron start/running, process 1024
[email protected]:~# service cron start
[email protected]:~# service cron stop
(3)使用crontab
1、对Cron作业进行列表
列出当前用户计划的cron作业 : [email protected]:~# crontab –l
如果想查看其它用户的cron作业,可以使用命令: [email protected]:~# crontab –l –u username 这会列出指定用户的cron作业。
2、编辑Cron作业 [email protected]:~# crontab -e
3、移除Cron作业 [email protected]:~# crontab –r 或者 [email protected]:~# crontab –ir 会进行询问是否删除
(4)用Crontab计划任务
文件内容语法
栏位的意义为:
代表意义 | 分钟 | 小时 | 日期 | 月份 | 周 | |
数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 |
分 时 日 月 周 command
15 2 2 * * mail [email protected] < /home/user/news 每个月第二天上午2:15给[email protected] 发送news
* (星号) 表示接受任何时间
,(逗号) * 3,6 * * * 表示该位置3和6都行
-(减号) * 3-6 * * * 代表3-6这一段时间范围
/n(斜线) 那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思 例如每五分钟进行一次,则: */5 * * * * command
Cron有两种配置文件类型,用于调度自动化任务。
1)系统级
系统的配置档: /etc/crontab
你只要编辑 /etc/crontab 这个文件就可以啦!有一点需要特别注意喔!那就是 crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个运行档,但是 /etc/crontab 可是一个『纯文字档』喔!你可以 root 的身份编辑一下这个文件哩!
基本上, cron 这个服务的最低侦测限制是『分钟』,所以『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 』,因此,只要你编辑完 /etc/crontab 这个文件,并且将他储存之后,那么 cron 的配置就自动的会来运行了!
注意:修改完之后需要重新启动:service crontab restart
/etc/crontab 的内容
[[email protected] ~]# cat /etc/crontab SHELL=/bin/bash <==使用哪种 shell 介面 PATH=/sbin:/bin:/usr/sbin:/usr/bin <==运行档搜寻路径 MAILTO=root <==若有额外STDOUT,以 email将数据送给谁 HOME=/ <==默认此 shell 的家目录所在 # run-parts 01 * * * * root run-parts /etc/cron.hourly <==每小时 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 <==每个月 1 号 分 时 日 月 周 运行者身份 命令串 Ubuntu调用run-parts命令,定时运行四个目录下的所有脚本。 /etc/cron.hourly下的脚本会被每小时运行一次,在每小时的17分时运行。 /etc/cron.daily下的脚本会被每天运行一次,在每天6点25分运行。 /etc/cron.weekly下的脚本会被每周运行一次,在每周第7天的6点47分运行。 /etc/cron.monthly下的脚本会被每月运行一次,在每月1号的6点52分运行。 以上执行时间可自行修改
2)用户级
Crontab语法如下:
[email protected]:~# crontab –e
写入以下的脚本
SHELL=/bin/bash
HOME=/
MAILTO=”[email protected]”
#This is a comment
* * * * * echo ‘test cron job to execute every minute‘
:wq! 保存并退出
[email protected]:/var/log$ sudo ls -al /var/spool/cron/crontabs/
drwx-wx--T 2 root crontab 4096 10月 11 18:36 .
drwxr-xr-x 5 root root 4096 10月 2 23:10 ..
-rw------- 1 root crontab 1114 10月 11 18:34 root
-rw------- 1 yeqing crontab 1115 10月 11 18:36 yeqing
3.可唤醒停机期间的工作任务
举例来说,如果你每天晚上都要关机,等到白天才启动你的 Linux 主机时,由於 默认的工作排程都在 4:02am 每天进行,唔!如此一来不就一堆系统例行工作都没有人在做了!那可怎么办?此时就得要 anacron 这家伙了!
什么是 anacron
anacron 并不是用来取代 crontab 的,anacron 存在的目的就在於我们上头提到的,在处理非 24 小时一直启动的 Linux 系统的 crontab 的运行!所以 anacron 并不能指定何时运行某项任务, 而是以天为单位或者是在启动后立刻进行 anacron 的动作,他会去侦测停机期间应该进行但是并没有进行的 crontab 任务,并将该任务运行一遍后,anacron 就会自动停止了。
总结
可以看到,用crontab实现自动化任务是很容易的,而且它可以按分钟、小时、周、月、星期来执行任务。除此之外,Linux还有一个at命令,它适用于处理只执行一次的任务,且需要先运行atd服务。
其次要注意环境变量的问题。有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在 crontab文件中没有配置环境变量引起的。在crontab文件中定义多个调度任务时,需要特别注环境变量的设置,因为我们手动执行某个任务时,是在 当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任 务运行所需的所有环境变量,这样,系统执行任务调度时就没有问题了。
还要注意清理系统用户的邮件日志。每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。
最后要注意,新创建的cron作业,不会马上执行,至少要过2分钟才执行。如果重启cron服务则会马上执行。
参考: