如何使用Crontab创建和管理计划任务(Cron Jobs)

在linux系统中,如果我们有一些任务(task)想要有规律的运行,像定期的系统维护,定期的命令执行,数据库的备份,磁盘的定期清理等,这时我们都可以使用Crontab这个工具来完成这些定时任务。

什么是crontab 文件?

当我们使用到crontab这个工具时,我们需要创建crontab文件来实现计划任务,crontab文件有两种类型,一种是用户私有的,主要仅限于用户个人的计划任务;另一种是系统全局文件,这种主要用于全局应用;在Red Hat和Centos系统中,crontab文件存放在 /var/spool/cron,而在ubuntu和debian系统中则存放在 /var/spool/cron/crontabs目录中。

你可以直接通过编辑文件来修改计划任务的配置,或是使用crontab这个命令来来修改配置。

而存放在/etc/crontab/etc/cron.d下的都是全局应用的计划任务,必须是管理员权限可才编写。

如何使用crontab

如何定义crontab的执行时间

在crontab文件中,每一行都包含着6个字段,它们之间用空隔隔开。前面5个字段代表周期时间,用于定义命令执行的周期间隔,而最后一字符是执行的命令。详细图示如下:

* * * * * command(s)
1- 2- 3- 4- 5- 6-
|  |  |  |  |  | --运行的命令或是命令脚本路径
|  |  |  | ----- 每周几 (0 - 7) (周日可用=0 或 7)
|  |  | ------- 月份 (1 - 12)
|  | --------- 日 (1 - 31)
| ----------- 时 (0 - 23)
------------- 分 (0 - 59)

前面表示时间的5个字段中的,任何一个字段可包括一个或多个值,如多个值时可用“,”分列,也可以使用“-“表示区间范围值,例如1-3。详细如下:

  • * -星号用于表示所有值或是一直不停止,例如你在表示“时”的第二字段使用*号,那就表过每小时都执行任务,你放到分字段,就代表每分钟都执行任务。
  • -逗号是用来表达几个值的合集时使用,例如你想每隔1,3,5小时执行一次任务,那你在第二字段(时字段)填入1,3,5值,就表过凌晨1点,3点,5点各执行一次任务。
  • -连字符用来表达一个范围的值,像如果在表示日的字段使用 “1-5”,那它的意思就是表示1日到5日,这5天每天执行一次任务。
  • / -斜杠可以用来过示每隔多久执行一次,例如在时字段上,使用值为 */3 这个值时,表示的是每隔3个小时值行一次,即是在(0,3,6,9,12,15,18,21,24)时各执行一次。你也可以把星号代换成一个“-”范围的值,例如:1-24/10, 这个值表示的范围是从1到24时的范围里,每隔10小时运行一次,那么其范围值是(1,11,21)。
全局性crontab文件

全局性定义文件与单用户在表达式基本是一样的,只是增加多了一个“用户名”字段,用于指定是由哪一个用户运行:

* * * * * <username> command(s)
预设定的调度宏

有几个特殊的 Cron 调度宏可以很方便快捷的替代上面的五个时间字段,使得你能更快速的使用Crontab来设定计划任务。

  • @yearly (或 @annually) -这个宏的意思就是每年的一月一日凌晨0点就执行一次任务。等同于 0 0 1 1 *
  • @monthly -每个月的第一天0点执行任务一次。等同于 0 0 1 * *
  • @weekly – 每周一凌晨0点执行一次任务,等同于 0 0 * * 0
  • @daily -每天0点执行一次任务,等同于 0 0 * * *
  • @hourly – 每小时执行一次任务 等同于 0 * * * *
  • @reboot -每次系统启动时执行任务,这个宏可以很好的用于一些需要开机自动加载的任务。

Linux中Crontab的命令使用

Crontab是一个用于管理计划任务的一工具,可以用来安装,查看,编辑crontab文件。主要使用命令的如下:

  • crontab -e -用于编辑现有的文件,如果路径文件不存在,并创建新的。
  • crontab -l -用于查看crontab文件内容。
  • crontab -r -删除你现有的crontab文件。
  • crontab -i -在删除你现有crontab文件前进行提示确认。
  • crontab -u <username>编辑其他用户的crtontab文件,这个命令需要管理员权限。

Crontab这个命令工具使用的文件编辑器是跟我们系统虚拟环境设置的一致,如果你没有设定,每一次使用时会让你选择默认的编辑器:

crontab editor

Crontab 的变量

Cron 的守护进程会自动以下几个虚拟环境变量:

  • 默认路径设置为 PATH=/usr/bin:/bin。如果您正在执行的命令不在 cron 指定的路径中,您可以使用该命令的绝对路径或更改 cron $PATH 变量。但您不能像使用常规脚本那样append :$PATH。例如:export PATH="$HOME/bin:$PATH"
  • 默认 shell 设置为 /bin/sh。如果要变更不同的shell,那我们就得使用到 SHELL Variable。这就涉及到linux 变量的创建,大家可以自行百度一下 Shell Variable或参考下面的案例
  • Cron 是从用户的主目录调用命令的,我们可以在可以在crontab中设置HOME变量的值。
  • 当我们修改 crontab 文件时,我们系统会用电子邮件通知 crontab 的所有者。要变更这个默认行为时,您可以使用 MAILTO 环境变量和您希望接收电子邮件通知的所有电子邮件地址的列表(逗号分隔)。当 MAILTO 已定义但为空 (MAILTO=””) 时,不发送邮件。当然系统中如没有设置好邮件环境的就不存在这个问题,你可以用 “echo $MAILTO “来查看当前MAILTO变量,并用”export MAILTO = “进行修改

Crontab限制使用

/etc/cron.deny/etc/cron.allow 文件允许您控制哪些用户可以访问 crontab 命令。这些文件由用户名列表组成,每行一个用户名。

在默认情况下,只有 /etc/cron.deny 文件存在且为空时,所有用户都可以使用 crontab 命令。如果要拒绝特定用户访问 crontab 命令,请将用户名添加到此文件中列表。

但当 /etc/cron.allow 文件存在,则表示的是只有在此文件中列出的用户才能使用 crontab 命令。

如果这两个文件都不存在,则只有具有管理权限的用户才能使用 crontab 命令。

案例分析解说

下面举几个例子来说明在不同的时间间隔执行相对应的命令,这样我们可以比较直观的学习了解Crontab的运用:

  • 设定每周一到周四的11:00执行命令任务:
0 11 * * 1-4 command
  • 每 10 分钟运行一个脚本并将标准输出定向到 dev null,只有标准错误会发送到指定的电子邮件地址:
MAILTO=email@example.com
*/10 * * * * /path/to/script.sh > /dev/null
  • 每周一15 点运行两个命令(在命令之间使用运算符 &&):
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=/usr/bin/zsh
MAILTO=email@example.com

*/1 * * * * command

写在最后

crontab命令在linux 中的使用十分频繁,应用也非常广,我们需要灵活运用好这个命运来管理整个系统的程序,这样可以解放我们很多不必要的工作时间,优化工作效率。你也可以访问 Crontab获取更多资讯。

如有什么不明白的可以留言,我看到后会一一回复。

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注