myfreax

Crontab定时任务

Cron是一个任务调度守护进程,它可以按指定的时间间隔执行任务,即定时任务。这些任务称为cron作业

8 min read
By myfreax
Crontab定时任务
Crontab定时任务

Cron是一个任务调度守护进程,它可以按指定的时间间隔运行任务,即定时任务。这些任务称为cron作业,主要用于自动化系统维护或管理。

例如,您可以设置cron作业来备份数据库,安装最新的安全补丁,更新系统,检查磁盘空间使用率,发送电子邮件等。

某些应用程序,如Drupal或Magento需要Crontab的定时任务才能运行某些功能。您可以按分钟,小时,月,日,星期几或这些时间的任意组合运行调度cron作业。

Crontab文件

Crontab是一个文本文件,用于指定cron作业的调度。有两个作用域不同crontab文件,分别是系统范围的crontab文件和用户的crontab文件。

用户的crontab文件是根据用户名命名的,其位置因操作系统而异。在基于RedHat的Linux发行版,例如CentOS。crontab文件存储在/var/spool/cron目录。

基于Debian的Linux发行版,例如Ubuntu。文件存储在/var/spool/cron/crontabs目录。

虽然您可以手动编辑用户的crontab文件。但建议使用crontab命令进行任务的安排和调度。

/etc/crontab/etc/cron.d目录中的文件是系统范围crontab文件,只能由root用户进行编辑。

在大多数Linux发行版中,您还可以将cron作业脚本存储在/etc/cron.{hourly,daily,weekly,monthly}目录。

这些目录将按hour/day/week/month执行一次脚本。每个脚本都必须具有可执行权限。否则,将不执行cron作业。

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

系统Crontab文件

系统范围的crontab文件的语法与用户crontabs略有不同。它包含一个额外且必需的用户字段,用于指定以那个用户身份运行Crontab定时任务。

* * * * * username command(s)
- - - - - -
| | | | | |
| | | | | --- user 
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

预定义的宏

有几个特殊的Cron调度宏用于指定共享间隔。您可以使用此快捷方式代替五列的日期规范。

@yearly@annually表示每年1月1日午夜凌晨12:00运行指定任务。相当于0 0 1 1 *@monthly在每月的第一天午夜运行一次指定的任务。相当于0 0 1 * *

@weekly在星期日的午夜运行指定的任务。相当于0 0 * * 0@daily每天午夜运行指定的任务一次。相当于0 0 * * *

@hourly每小时运行一次指定的任务。相当于0 * * * *@reboot在系统启动时运行指定的任务。

Linux Crontab命令

crontab命令允许您打开crontab文件以进行编辑。您可以使用crontab命令以及以下选项查看,添加,删除或修改cron作业。

crontab -e表示编辑crontab文件,如果crontab文件不存在则创建crontab文件。crontab -l查看crontab文件内容。crontab -r删除当前的crontab文件。

crontab -i交换式删除当前的crontab文件,也就是有提示。crontab -u <username>指定用户,需要root权限。

crontab -e #edit cron job
crontab -l #list cron job
crontab -i #remove cron job
sudo crontab -u myfreax -l #check cron job of user

crontab命令使用VISUALEDITOR环境变量指定的编辑器打开crontab文件。

如果你需要使用vim编辑器,则可这样EDITOR=vim crontab -e运行Crontab命令。使用nano编辑器,则可这样EDITOR=nano crontab -e运行Crontab命令。

如果你像我们一样,总是使用vim编辑器,编辑任何配置文件。则可以设置系统的默认编辑器为vim。

运行命令echo "export EDITOR=vim" | sudo tee -a /etc/environment

EDITOR=vim crontab -e
EDITOR=nano crontab -e
echo "export EDITOR=vim" | sudo tee -a /etc/environment

Crontab变量

在运行你的定时任务时,Crontab默认将环境变量PATH设置为PATH=/usr/bin:/bin。如果要调用的命令不存在于Crontab指定的PATH环境变量中。

则需要使用命令的绝对路径或更改Crontab默认指定$PATH变量。您不能像使用普通脚本那样隐式添加目录到$PATH

Crontab在运行你的任务时将默认的shell设置为/bin/sh。您可以通过更改SHELL变量来设置运行cron任务的shell。

Cron从用户的家目录运行命令,即将用户的家目录作为你程序的工作目录。HOME环境变量可以在cron任务脚本设置与覆盖。

电子邮件通知将发送给crontab的所有者。要覆盖默认行为,您可以设置MAILTO环境变量以及要接收电子邮件通知的电子邮件地址列表。

如果MAILTO已定义但为空MAILTO="",则不发送邮件。

Crontab限制

系统管理员可以使用/etc/cron.deny/etc/cron.allow文件控制哪些用户可以访问crontab命令。这两个文件包含一个用户名列表,每行一个用户名。

默认情况下,如果/etc/cron.deny文件存在且为空,这意味着所有用户都可以使用crontab命令。

如果要拒绝对指定用户访问crontab命令,请将用户名添加到此文件中。

如果/etc/cron.allow文件存在,则只有此文件中列出的用户才能运行crontab命令。如果两个文件都不存在,则只有root用户才能使用crontab命令。

cron示例

下面是一些cron定时任务示例,将向您展示如何安排在不同时间段运行的任务。

0 15 * * 1-5 command表示从星期一到星期五每天15:00运行command命令。

分钟字段是0表示0分,小时字段是15表示15时,day/天字段*表示每日,月字段*表示每个月,week周字段1-5表星期一到星期五,command最后是你要执行的命令。

0 15 * * 1-5 command

MAILTO=web@myfreax.com

MAILTO=email@myfreax.com表示覆盖环境变量MAILTO默认值,分钟字段是*/5表示每5分钟,小时字段是*即每小时,后面的*你应该清楚。

*/5 * * * * /path/to/script.sh > /dev/null每5分钟运行一次脚本并将标准输出重定向/dev/null,只有标准错误才会发送到指定的电子邮件地址。

MAILTO=web@myfreax.com
*/5 * * * * /path/to/script.sh > /dev/null

0 15 * * Mon command1 && command2

每周的星期一,下午3点运行两个命令command1和command2,使用&&运算符表示运行command1之后再运行command2。

分钟字段是0表示0分钟,小时字段是15即下午3点,*你应该清楚,week周字段在是Mon,表示每一周的星期一。

0 15 * * Mon command1 && command2

*/2 * * * * /opt/app/php /path/to/script.php >> /var/log/script.log

每2分钟运行一次PHP脚本并将标准输出重定向到文件/var/log/script.log

由于php命令不存在Crontab默认的变量$PATH,因此在运行php脚本时。使用绝对路径指定脚本的解释器。在这个示例是/opt/app/php

*/2 * * * * /opt/app/php /path/to/script.php >> /var/log/script.log

从上午8点到下午4点,每小时运行一次/path/to/script.sh脚本。

0 8-16 * * * /path/to/script.sh

每一分钟运行分钟运行一次command命令。并覆盖默认环境/设置变量HOMEPATHSHELLMAILTO变量。

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作业和计划任务。如果您有任何疑问,请随时发表评论。