linux cron 是一个可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程,linux cron 假定系统是持续运行的。如果当某任务被调度时系统不在运行,该任务就不会被执行。要使用 linux cron 服务,你必须安装了 vixie-cron RPM 软件包,而且必须在运行 crond 服务。要判定该软件包是否已安装,使用 rpm -q vixie-cron 命令。要判定该服务是否在运行,使用 /sbin/service crond status 命令。

crond 是 linux 用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而 linux 任务调度的工作主要分为以下两类:
1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
2、个人执行的工作:某个用户定期要做的工作,例如每隔 10 分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置

linux cron 的主配置文件是 /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

前四行是用来配置 linux cron 任务运行环境的变量。

SHELL 变量的值告诉系统要使用哪个 shell 环境(在这个例子里是 bash shell);

PATH 变量定义用来执行命令的路径。

MAILTO cron 任务的输出被邮寄给 MAILTO 变量定义的用户名。如果 MAILTO 变量被定义为空白字符串(MAILTO=””),电子邮件就不会被寄出。

HOME 变量可以用来设置在执行命令或脚本时使用的主目录。

/etc/cron.allow 和 /etc/cron.deny 文件被用来限制对 cron 的使用。这两个使用控制文件的格式都是每行一个用户。两个文件都不允许空格。如果使用控制文件被修改了,cron 守护进程(crond)不必被重启。使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。无论使用控制文件中的规定如何,根用户 (root) 都总是可以使用 cron。


如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且 cron.deny 文件会被忽略。

如果 cron.allow 文件不存在,所有在 cron.deny 中列出的用户都被禁止使用 cron。

另外在 /var/spool 下面存在着两个目录 cron,anacron, 其中 cron 目录下面有每个用户的自己通过 crontab -e 增加的 crontab 的内容。anacron 目录下面是记录的是 cron.daily,cron.monthly,cron.weekly 的上一次执行的时间。linux 的 cron 服务是每隔一分钟去读取一次 /var/spool/cron,/etc/crontab,/etc/cron.d 下面所有的内容。

linux cron 基本格式 :
         command
分  时  日  月  周  命令
第 1 列表示分钟 1~59 每分钟用
或者 */1 表示
第 2 列表示小时 1~23(0 表示 0 点)
第 3 列表示日期 1~31
第 4 列表示月份 1~12
第 5 列标识号星期 0~6(0 表示星期天)
第 6 列要运行的命令

crontab 文件的一些例子:

下面的例子表示每晚的 21:30 重启 apache。

30 21 * * * /usr/local/etc/rc.d/lighttpd restart

下面的例子表示每月 1、10、22 日的 4 : 45 重启 apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart

下面的例子表示每周六、周日的 1 : 10 重启 apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart


下面的例子表示在每天 18 : 00 至 23 : 00 之间每隔 30 分钟重启 apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart


下面的例子表示每星期六的 11 : 00 pm 重启 apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart


每一小时重启 apache

* */1 * * * /usr/local/etc/rc.d/lighttpd restart


晚上 11 点到早上 7 点之间,每隔一小时重启 apache

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart

每月的 4 号与每周一到周三的 11 点重启 apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart

一月一号的 4 点重启 apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart


在 12 月内, 每天的早上 6 点到 12 点中,每隔 3 个小时执行一次 /usr/bin/backup :

0 6-12/3 * 12 * /usr/bin/backup

周一到周五每天下午 5:00 寄一封信给 alex@domain.name :

0 17 * * 1-5 mail -s "hi" alex@domain.name 

每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分…. 执行 echo “haha”

20 0-23/2 * * * echo "haha"

注意 :
当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之 后加上 > /dev/null 2>&1 即可

# 每天早上 6 点 10 分

10 6 * * * date

# 每两个小时

0 */2 * * * date

# 晚上 11 点到早上 8 点之间每两个小时,早上 8 点

0 23-7/2,8 * * * date

# 每个月的 4 号和每个礼拜的礼拜一到礼拜三的早上 11 点

0 11 4 * mon-wed date

#1 月份日早上 4 点

0 4 1 jan * date

linux cron 命令总结:
crontab file [-u user]- 用指定的文件替代目前的 crontab。
crontab-[-u user]- 用标准输入替代目前的 crontab.
crontab-1[user]- 列出用户目前的 crontab.
crontab-e[user]- 编辑用户目前的 crontab.
crontab-d[user]- 删除用户目前的 crontab.
crontab-c dir- 指定 crontab 的目录。

crontab 文件的格式:M H D m d cmd.
M: 分钟(0-59)。
H:小时(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0 为星期天)。
cmd 要运行的程序,程序被送入 sh 执行,这个 shell 只有 USER,HOME,SHELL 这三个环境变量

当 f1 为 时表示每分钟都要执行 program,f2 为 时表示每小时都要执行程序,其馀类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
当 f1 为 /n 时表示每 n 分钟个时间间隔执行一次,f2 为 /n 表示每 n 小时个时间间隔执行一次,其馀类推
当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其馀类推
使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。

本文地址 https://shaoshilei.com/2014-04/linux-environment-cron-service-comments.html