Cron是一个任务调度守护进程,它可以按指定的时间间隔执行任务。这些任务称为cron作业,主要用于自动化系统维护或管理。
例如,您可以设置cron作业来备份数据库或数据,使用最新的安全修补程序更新系统,检查磁盘空间使用情况,发送电子邮件等。某些应用程序(如Drupal或Magento)需要cron作业才能执行某些功能。
您可以安排cron作业按分钟,小时,月,日,星期几或这些的任意组合时间运行。
什么是Crontab文件
Crontab(cron表)是一个文本文件,用于指定cron作业的计划。有两种类型的crontab文件。系统范围的crontab文件和用户的crontab文件。
用户crontab文件按用户名存储,其位置因操作系统而异。在基于Red Hat的系统(如CentOS)中,crontab文件存储在/var/spool/cron
目录中,而Debian和Ubuntu文件存储在/var/spool/cron/crontabs
目录中。
虽然您可以手动编辑用户的crontab文件,但建议使用crontab
命令。
/etc/crontab/etc/cron.d
目录中的文件是系统范围的crontab文件,只能由系统管理员编辑。
在大多数Linux发行版中,您还可以将脚本放在/etc/cron.{hourly,daily,weekly,monthly}
目录中,并且每次都会执行脚本hour/day/week/month
。
Crontab语法和运算符
用户crontab文件中的每一行包含六个以空格分隔的字段,后跟要运行的命令。
* * * * * command(s)
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)
前五个字段可以包含一个或多个值,用逗号或由字符分隔的值范围分隔。
-
*
- 星号运算符表示任何值始与终。如果您在小时字段中有星号符号,则表示该任务将每小时执行一次。 -
,
- 逗号运算符允许您指定重复值的列表。例如,如果1,3,5
在“小时”字段中,则任务将在凌晨1点,凌晨3点和凌晨5点运行。 -
-
- 连字符运算符允许您指定一个范围值。如果1-5
在星期几字段中,任务将在每个工作日(从星期一到星期五)运行。 -
/
- 斜杠运算符允许您指定它们之间的特定间隔重复的值。例如,如果*/4
在“小时”字段中,则表示该操作将每四个小时执行一次。它与指定相同0,4,8,12,16,20
。相反,星号斜线操作之前,你也可以使用一个范围值的,1-30/10
意思是一样的1,11,21
。
系统范围的Crontab文件
系统范围的crontab文件的语法与用户crontabs略有不同。它包含一个额外的必需用户字段,用于指定在哪个用户下运行cron作业。
* * * * * <username> command(s)
预定义的宏
有几个特殊的Cron调度宏用于指定公共间隔。您可以使用此快捷方式代替五列日期规范。
-
@yearly
(或@annually
) - 每年1月1日午夜(凌晨12:00)运行指定任务。相当于0 0 1 1 *
。 -
@monthly
- 在每月的第一天午夜每月运行一次指定的任务。相当于0 0 1 * *
。 -
@weekly
- 在星期日的午夜一周运行指定的任务nconcee。相当于0 0 * * 0
。 -
@daily
- 每天午夜运行指定的任务一次。相当于0 0 * * *
。 -
@hourly
- 在小时开始时每小时运行一次指定的任务。相当于0 * * * *
。 -
@reboot
- 在系统启动时(启动时)运行指定的任务。
Linux Crontab命令
crontab命令允许您打开crontab文件以进行编辑。您可以使用crontab命令以及以下选项查看,添加,删除或修改cron作业:
-
crontab -e
- 编辑crontab文件,或者如果它尚不存在则创建一个。 -
crontab -l
- 显示crontab文件内容。 -
crontab -r
- 删除当前的crontab文件。 -
crontab -i
- 删除之前删除当前的crontab文件并提示。 -
crontab -u <username>
- 编辑其他使用crontab文件。需要系统管理员权限。
crontab命令使用VISUAL
或EDITOR
环境变量指定的编辑器打开crontab文件。

Crontab变量
cron守护程序自动设置几个环境变量。
- 默认路径设置为
PATH=/usr/bin:/bin
。如果要调用的命令存在于cron指定的路径中,则可以使用命令的绝对路径或更改cron$PATH
变量。您不能像使用:$PATH
普通脚本那样隐式添加。 - 默认shell设置为
/bin/sh
。您可以通过更改SHELL
变量来设置不同的shell 。 - Cron从用户的主目录调用命令。
HOME
变量可以被crontab中的设置覆盖。 - 电子邮件通知将发送给crontab的所有者。要覆盖默认行为,您可以使用
MAILTO
环境变量以及要接收电子邮件通知的所有电子邮件地址的列表(以逗号分隔)。如果MAILTO
已定义但为空(MAILTO=""
),则不发送邮件。
Crontab限制
系统管理员可以使用/etc/cron.deny
和/etc/cron.allow
文件控制哪些用户可以访问crontab
命令。这些文件包含一个用户名列表,每行一个用户名。
默认情况下,只有/etc/cron.deny
文件存在且为空,这意味着所有用户都可以使用crontab命令。如果要拒绝对特定用户访问crontab命令,请将用户名添加到此文件中。
如果/etc/cron.allow
文件存在,则只有此文件中列出的用户才能使用该crontab
命令。
如果两个文件都不存在,则只有具有管理权限的用户才能使用crontab
命令。
Cron Jobs的例子
下面是一些cron作业示例,它们将向您展示如何安排在不同时间段运行的任务。
从星期一到星期五每天15:00运行命令:
0 15 * * 1-5 command
每5分钟运行一次脚本并将标准输出重定向到 /dev/null
,只有标准错误才会发送到指定的电子邮件地址:
MAILTO=email@example.com
*/5 * * * * /path/to/script.sh > /dev/null
每周一下午3点运行两个命令(在命令之间使用&&
运算符):
0 15 * * Mon command1 && command2
每2分钟运行一次PHP脚本并将输出写入文件:
*/2 * * * * /usr/bin/php /path/to/script.php >> /var/log/script.log
从上午8点到下午4点,每天,每小时运行脚本:
00 08-16 * * * /path/to/script.sh
在每个月的第一个星期一早上7点运行脚本
0 7 1-7 * 1 /path/to/script.sh
在每个月的1号和15号下午9:15运行脚本:
15 9 1,15 * * /path/to/script.sh
设置自定义HOME
,PATH
,SHELL
和MAILTO
变量和每一分钟运行一个命令的。
HOME=/opt
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/zsh
MAILTO=email@example.com
*/1 * * * * command
您已经学习了如何在特定日期和时间创建cron作业和计划任务。如果您有任何疑问,请随时发表评论。如果你喜欢我们的内容可以选择在下方二维码中捐赠我们,或者点击广告予以支持,感谢你的支持