第十五章 例行性工作(crontab)--循环执行的例行性工作调度 crontab(定时任务)
循环执行的例行性工作调度 crontab(定时任务)
15.1 例行性工作调度 不考虑硬件与服务器的链接状态,Linux帮助提醒很多任务。 Linux例行性工作是如何进行调度的? Linux调度就是通过 crontab 与 at 这两个东西 15.1.1 Linux工作调度的种类:at,cron 两种工作调度的方式: 一种是例行性的,每隔一定的周期要来办的事情,定时任务 一种是突发性的,就是每次做完以后就不在执行的,只调度一次 at:at是可以处理仅执行一次就结束调度的指令,不过要执行at时,必须要有 atd这个服务的支持才行。在某些新版的 distributions 中,atd 可能默认并没有启动,那么 at 这个指令就会失效呢!不过我们 CentOS 默认是启动的! crontab:crontab 这个指令所设置的工作将会循环的一直进行下去! 可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外,亦可编辑 /etc/crontab 来支持。 让 crontab 可以生效的服务则是 crond 这个服务! 15.1.2 CentOS Linux系统上常见的例行性工作 Linux系统常见的例行性任务有: ① 进行登录文件的轮替(log rotate):Linux会主动的将系统所发生的各种信息都记录下来,这就是登录文件(第十八章)。 系统会一直记录登录信息,所以登录文件将会越来越大,大型文件不但占容量还会造成读写性能的困扰,因此适时的将登陆文件数据挪一挪,让旧的数据与新的数据分别存放可以有效的记录登录信息。这就是 log rotate 的任务,这也是系统必要的例行任务。 ②登录文件分析 logwatch 的任务:如果系统发生软件问题、硬件错误、资安问题等,绝大部分的错误信息都会被记录到登录文件中, 因此系统管理员的重要任务之一就是分析登录文件。但你不可能手动通过 vim 等软件去检视登录文件,因为数据太复杂了! 我们的 CentOS 提供了一只程序“ logwatch ”来主动分析登录信息。 ③创建 locate 的数据库: 在第六章我们谈到的 locate 指令时, 我们知道该指令是通过已经存在的文件名数据库来进行系统上文件名的查询。我们的文件名数据库是放置到 /var/lib/mlocate/ 中。 问题是,这个数据库怎么会自动更新啊?这就是系统的例行性工作所产生的效果,系统会主动的进行 updatedb ! ④man page 查询数据库的创建: 与 locate 数据库类似的,可提供快速查询的 man pagedb 也是个数据库,但如果要使用 man page 数据库时,就得要执行 mandb 才能够创建好! 而这个 man page 数据库也是通过系统的例行性工作调度来自动执行的。 ⑤RPM 软件登录文件的创建: RPM (第二十二章) 是一种软件管理的机制。由于系统可能会常常变更软件, 包括软件的新安装、非经常性更新等,都会造成软件文件名的差异。为了方便未来追踪,系统也帮我们将文件名作个排序的记录, 有时候系统也会通过调度来帮 RPM 数据库的重新创建。 ⑥移除暂存盘: 某些软件在运行中会产生一些暂存盘,但是当这个软件关闭时,这些暂存盘可能并不会主动的被移除。 有些暂存盘则有时间性,如果超过一段时间后,这个暂存盘就没有效用了,此时移除这些暂存盘就是一件重要的工作! 否则磁盘容量会被耗光。系统通过例行性工作调度执行名为 tmpwatch 的指令来删除这些暂存盘。 ⑦与网络服务有关的分析行为: 如果你有安装类似 WWW 服务器软件 (一个名为 apache的软件),那么你的 Linux 系统通常就会主动的分析该软件的登录文件。 同时某些凭证与认证的网络信息是否过期的问题, Linux 系统也会很友好的进行自动检查。 15.2 仅执行一次的工作调度 at:单一工作调度的运行 15.3 循环执行的例行性工作调度 相对于 at 是仅执行一次的工作,循环执行的例行性工作调度则是由 cron (crond) 这个系统服务来控制的。 Linux系统上面原本就有非常多的例行性工作,因此这个系统服务是默认启动的。 使用者自己也可以进行例行性工作调度,所以,Linux也提供使用者控制例行性工作调度的指令(crontab) 15.3.1 使用者的设置 使用者想要创建循环型工作调度时使用的是 crontab 这个指令。为了安全性的问题与at一样,我们可以限制使用 crontab 的使用者帐号。使用的限制数据有: /etc/cron.allow: 将可以使用 crontab 的帐号写入其中,若不在这个文件内的使用者则不可使用 crontab; /etc/cron.deny: 将不可以使用 crontab 的帐号写入其中,若未记录到这个文件当中的使用者,就可以使用 crontab 。 以优先顺序来说, /etc/cron.allow 比 /etc/cron.deny 要优先而判断上面,这两个文件只选择一个来限制而已,因此,建议你只要保留一个即可, 免得影响自己在设置上面的判断!一般来说,系统默认是保留 /etc/cron.deny , 可以将不想让他执行 crontab 的那个使用者写入 /etc/cron.deny 当中,一个帐号一行! 当使用者使用 crontab 这个指令来创建工作调度之后,该项工作就会被记录到 /var/spool/cron 里面去,而且是以账号来作为判别的。 如下:root用户使用 crontab 后,工作会被记录到 /var/spool/cron/root 文件中去,不要使用 vi 直接编辑该文件,因为可能由于输入语法错误,会导致无法执行cron /var/spool/cron/ 中的内容:




















* :代表任何值 ? : 也代表任何值,但只用于 Day-of-month 和 Day-of-Week ,当其中一个设置了条件时,另外一个就要用 ? 来表示“任何值” - : 用来表示范围,比如 Day-of-month 5-10 代表 5号到10号 , :用来添加附加的参数,比如 Hours 4,14 代表上午 4 点和下午两点 / : 用来代表增量以用来循环,比如 Hours 2/6 代表 2点,8点,下午2点,下午8点 L : 用于 Day-of-month 和 Day-of-Week, 代表最后1天,在Day-of-month中只用'L'就可以,在Day-of-week中用 'nL' 来代表是最后一个星期n W : 用于 Day-of-month, 代表最近工作日,比如 '15W', 如果15号那天是周六则取14号周五,如果是周日则取16号周一,其他情况不变 LW : 代表当月最后一个工作日 # : 用于 Day-of-Week, 'n#m'用于代表当月第m个 "周n"(根据n在week中的定义确定)

更多精彩