用Crontab来调度Cron工作

评论 0 浏览 0 2018-12-17

Cron是一个调度守护程序,在指定的时间间隔内执行任务。这些任务被称为cron作业,主要用于自动化系统维护或管理。

例如,您可以设置一个cron job来自动执行重复性任务,如备份数据库或数据、用最新的安全补丁更新系统、检查磁盘空间使用情况、发送电子邮件,等等。

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 job。

* * * * * <username> command(s)

预定义的宏

有几个特殊的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 - 在系统启动时(boot-time)运行指定的任务。

Linux的Crontab命令

crontab命令允许你安装、查看,或打开crontab文件进行编辑。

  • crontab -e - 编辑crontab文件,如果它不存在,则创建一个文件。
  • crontab -l - 显示crontab文件的内容。
  • crontab -r - 移除你当前的crontab文件。
  • crontab -i - 移除你当前的crontab文件,在移除前有提示。
  • crontab -u <username> - 编辑其他用户的crontab文件。这个选项需要系统管理员的权限。

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

Create Cron Job

Crontab 变量

cron 守护程序会自动设置几个环境变量

  • 默认的路径被设置为PATH=/usr/bin:/bin。如果你要执行的命令不在cron指定的路径中,你可以使用命令的绝对路径或者改变cron的$PATH变量。你不能像对普通脚本那样隐含地append :$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工作的例子

下面是一些cron job的例子,显示了如何安排一个任务在不同的时间段运行。

  • 从周一到周五,每天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
  • 设置自定义的HOMEPATHSHELLMAILTO变量,并每分钟运行一条命令。

    HOME=/opt
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    SHELL=/usr/bin/zsh
    MAILTO=email@example.com
    
    */1 * * * * command

总结

Cron是一个守护程序,它允许你在特定的日期和时间安排任务。

如果您有任何问题,请随时留言咨询。

最后更新2023-09-04
0 个评论