看了两天的,终于觉得把这个Cron看得稍微明白点了,总结一下。
刚开始的时候对于后台进程,守护进程,以及cron进程的关系根本没弄清楚,现在了解了。就像我前面的文字里面写的:
后台进程:运行时无须用户输入的程序。可以在诸如 UNIX/Linux 之类的多任务操作系统上运行多个后台进程,而用户则与前台进程交互(例如,数据输入)。有些后台进程(例如守护程序)从来都不需要用户输入。其它一些进程只是在用户忙于目前运行于前台的程序时才临时处于后台。
守护进程是一种后台进程。Cron进程是众多守护进程中的一种,看看Cron这个单词在字典里面的解释:
cron
= chronograph,【unix】(时钟)守护程序,(精密)计时程序
从字面意思就可以大概了解,它是一种和时间有关系的程序,简单的说,cron守护进程执行预定的命令,他会在预定的时间执行预订的命令或者脚本。
好,知道了他是干嘛的,现在就来了解他是怎么工作的。
“以一定的时间间隔运行作业需要使用 cron 进行管理,它由crond守护进程和一组表(描述执行哪些操作和采用什么样的频率)组成。这个守护进程每分钟唤醒一次,并通过检查 crontab 判断需要做什么。用户使用crontab命令管理 crontab。crond守护进程常常是在系统启动时由 init 进程启动的。”
注:上文摘自网络,实际上,在我的机器上,安装的是Vixie-Cron,所以我的电脑上不是crond,而是Vixie-Cron
关于crontab这个表的内容,以及如何写这个表,前面一篇文字已经有讲过,不再赘述。有一点新的内容需要补充,时间后面的字段,也就是第六个字段:第 6 个字段包含前 5 个字段之后的所有内容,它是要传递给shell 的字符串。百分号(%)将转换为空行,所以如果要使用 % 或其他任何特殊字符,就要在前面加上反斜线(\)。第一个 % 之前的一行传递给 shell,这个 % 之后的所有行都作为标准输入传递。
一般来说,只有root用户才有权限去运行cron进程,若管理员允许或者禁止其他用户使用,则应编辑/etc/下面的c r o n . d e n y和c r o n . a l l o w这两个文件来禁止或允许用户拥有自己的c r o n t a b文件。
每一个用户都可以有自己的c r o n t a b文件,但在一个较大的系统中,系统管理员一般会禁止这些文件,而只在整个系统保留一个这样的文件。系统管理员是通过c r o n . d e n y和c r o n . a l l o w这两个文件来禁止或允许用户拥有自己的c r o n t a b文件。
若没有自己的crontab文件,则第一次使用时可能应该手动创建一个文件,然后使用$ crontab <你的crontab文件名> 来提交你的crontab,之后就可以用crontab命令来修改,删除,列出你的crontab的内容了。关于如何此命令如何使用也参见上一篇关于cron的博客日志。
注:crontab这个词的意思,本身他是一个表,里面记录预订时间预定执行的命令或脚本;第二,他也是个命令,用户使用 crontab 命令管理 crontab这个表。
cron在运行的时候要查看crontab来进行作业的调度。这里上文有几句话非常重要,解释了我碰到过的问题:这个守护进程每分钟唤醒一次,并通过检查 crontab 判断需要做什么。每分钟检查一次crontab,然后做一次运行命令或脚本的安排。
用户自己创建的crontab在哪儿呢?在这里:/var/spool/cron/crontabs 。其实,cron检查的crontab不只包括用户自己创建的crontab,还有系统的crontab,包括/etc/crontab和/etc/cron.d 目录中的文件(/etc/cron.d 下有可能会存在at调度的作业)。其中/etc/crontab有必要解释一下,一个典型的例子:
/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# 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
在这些系统 crontab 中,在第五个时间字段(星期)和命令之间增加了一个字段。这个字段指定哪个用户应该运行这个命令,一般情况下是根用户。然后解释下后面的命令:在/etc/下会有cron.hourly,cron.daily,cron.weekly,cron.monthly这四个文件夹,他们下面分别放着一些文件,用来指定每小时,每天,每个星期,每个月要执行的操作,命令run-parts的意思是执行下面目录里面的程序和脚本,例如run-parts /etc/cron.hourly意思就是执行/etc/cron.hourly文件夹下的程序以及脚本。
在这个示例中,真正的工作由 run-parts 命令执行,它运行 /etc/cron.hourly、/etc/cron.daily 等目录中的脚本;/etc/crontab 仅仅控制执行作业的时间。注意,这里的所有命令都作为根用户运行。还要注意,crontab 可以包含 shell 变量赋值,这些赋值会在运行命令之前执行。
输出