周期性运行一批程序(cron)

前面介绍at命令都会在一定时间内完成一定任务,但是它只能执行一次。也就是说,当指定了运行命令后,系统在指定时间完成任务,以后就不再执行了。但是在很多情况下需要周期性重复执行一些命令,这时候就需要使用cron命令来完成任务。

运行机制

首先cron命令会搜索/var/spool/cron目录,寻找以/etc/passwd文件中的用户名命名的crontab文件,被找到的这种文件将装入内存。比如一个用户名为globus的用户,对应的crontab文件应该是/var/spool/cron/globus,即以该用户命名的crontab文件存放在/var/spool/cron目录下面。

cron命令还将搜索/etc/crontab文件,这个文件是用不同的格式写成的。cron启动以后,它将首先检查是否有用户设置了crontab文件,如果没有就转入睡眠状态,释放系统资源。所以该后台进程占用资源极少,它每分钟被换醒一次,查看当前是否有需要运行的命令。

命令执行结束后,任何输出都将作为邮件发送给crontab的所有者,或者是/etc/crontab文件中MAILTO环境变量中指定的用户。这是cron的工作原理,但是cron命令的执行不需要用户干涉,用户只需要修改crontab中要执行的命令。

crontab命令

crontab命令用于安装、删除或者显示用于驱动cron后台进程的表格。用户把需要执行的命令序列放到crontab文件中以获得执行,而且每个用户都可以有自己的crontab文件。

crontab命令的常用方法如下:

  • crontab -u //设置某个用户的cron服务,root用户在执行crontab时需要此参数。
  • crontab -l //列出某个用户cron服务的详细内容。
  • crontab -r //删除某个用户的cron服务。
  • crontab -e //编辑某个用户的cron服务。

例如root查看自己的cron设置。命令如下:

  1. crontab -u root -l

crontab文件

在crontab文件中输入需要执行的命令和时间。该文件中每行都包括6个域,其中前5个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。格式如下:

  1. minute hour day-of-month month-of-year day-of-week commands

对于每一项的说明如所示。

表 1 参数说明

参数

描述

minute

分钟(0~59)。

hour

小时(0~23)。

day-of-month

一个月的第几天(1~31)。

month-of-year

一年的第几个月(1~12)。

day-of-week

一周的星期几(0~6),0代表星期天。

commands

需要执行的命令。

这些项都不能为空,必须指定值。除了数字还有几个特殊的符号“*”、“/”和“-”、“,”。其中,*代表所有的取值范围内的数字,/代表每的意思,“*/5”表示每5个单位,“-”代表从某个数字到某个数字,“,”分开几个离散时数字。对于要执行的命令,调用的时候需要写出命令的完整路径。

例如晚上18点到22点之间每两个小时,在/tmp/test.txt文件中加入sleepy文本。在crontab文件中对应的行如下:

  1. * 18-22/2 * * * echo "sleepy" >> /tmp/test.txt

每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件。此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e来编辑。用户也可以另外建立一个文件,使用“cron文件名”命令导入cron设置。

假设有个用户名为globus,它需要为自己创建的一个crontab文件。步骤如下:

  1. 首先可以使用任何文本编辑器建立一个新文件,并将向该文件加入需要运行的命令和要定期执行的时间,假设该文件为 ~/globus.cron。
  2. 然后使用crontab命令安装这个文件,使用crontab命令使之成为该用户的crontab文件。命令如下:

    1. crontab globus. ~/globus.cron

这样crontab文件就建立好了,可以转到/var/spool/cron目录下面查看,发现多了一个globus文件。这个文件就是所需的crontab文件。

周期性运行一批程序(cron) - 图1 说明:
cron启动后,每过一分钟读一次crontab文件,检查是否要执行里面的命令。因此该文件被修改后不需要重新启动cron服务。

编辑配置文件

cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此通过配置这个文件也能得到cron的服务。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式如下:

  1. SHELL=/bin/sh
  2. PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
  3. MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个账号
  4. HOME=/
  5. # run-parts
  6. 01 * * * * root run-parts /etc/cron.hourly //每个小时执行一次/etc/cron.hourly里的脚本
  7. 02 4 * * * root run-parts /etc/cron.daily //每天执行一次/etc/cron.daily里的脚本
  8. 22 4 * * 0 root run-parts /etc/cron.weekly //每周执行一次/etc/cron.weekly里的脚本
  9. 42 4 1 * * root run-parts /etc/cron.monthly //每月执行一次/etc/cron.monthly里的脚本

周期性运行一批程序(cron) - 图2 说明:
如果去掉run-parts参数,其后面就是运行的某个脚本名,而不是目录名。