Crontab 快速上手

Crontab 是Unix 系统中基于时间的任务管理工具。php

这个命令与传统的 Unix 命令不同,下面会一一介绍其规则及其用法。html

crontab 仍是 cron

crontab 仍是 cron?初次接触 crontab 的同窗可能会被这两个词给绕晕。linux

其实能够这样来理解:crontab就是 cron服务的命令行工具,而cron则是背后处理crontab投递任务的服务。服务器

文件格式

crontab 命令是以固定的时间格式来使用的,工具

表示意义 分钟 小时 日期 月份 命令
范围 0~59(*) 0~23(*) 1~31(*) 1~12(*) 0~7(*) 须要执行的命令

另外还有一些特殊字符具备特殊含义:spa

  • * 表示任什么时候刻都接收。举个栗子:* 12 * * * 表示不论何月、何日的星期几的十二点都执行指定命令。

经常使用实例

每分钟执行一次:命令行

*/1 * * * * 或者 * * * * *

每五分钟执行一次:nuxt

*/5 * * * *

每小时执行一次:rest

0 * * * *  或者 0 */1 * * *

天天执行一次:日志

0 0 * *  *

每周执行一次:

0 0 * *  0

每个月执行一次:

0 0 1 *  0

如何使用

初次接触crontab 命令时,我也比较纳闷,这个命令倒底是如何使用的?

使用 crontab 有两种方式:

  1. crontab -e:直接接受标准输入(键盘)上键入的命令,并将它们载入crontab。
  2. crontab file:将file 做为crontab 的任务列表文件并载入crontab

第一种方式没什么好说的,直接在终端添加 crontab 任务就好了,下面简单说一下第二种(其实二者的核心都是同样的)。

建立crontab 文件

首先建立一个文件,该文件的内容以功能描述执行时间执行任务 这几部分组成。

其中,前二者并非必定须要,只是为了方便本身往后或其余人能快速知道这个任务具体是作什么的,# 表示注释。

示例,建立一个名称为script_cron 的crontab 文件:

# 每分钟执行一次 script.php 脚本
* * * * * /usr/bin/php ~/script.php

运行crontab

为了提交刚刚建立的crontab 文件,能够把这个新建立的文件名称做为crontab命令的参数:

$ crontab script_cron

列出cron 服务

使用-l 参数列出crontab文件:

$ crontab -l
# 每分钟执行一次 script.php 脚本
* * * * * /usr/bin/php ~/script.php

编辑cron 服务

$ crontab -e

删除cron 服务

$ crontab -r

常见问题

crontab 没有当即生效

新建立的cron 任务,不会立刻执行,至少要过两分钟才执行。

若是但愿能立刻执行,能够重启 crontab 。

// Ubuntu:
$ service cron restart    

// Centos
$ service crond restart

crontab 压根没执行

有时候会遇到直接在命令行中能够执行任务,可是定时任务却怎么都不执行,

这时首先须要确认 cron 服务是否正常:

// Ubuntu:
$ service cron status    

// Centos
$ service crond status

而后确认须要执行的任务是否包含路径,若是包含请使用全局路径。

最后重启 cron 服务,一般到这里就已经能够正常执行了,若是还不行,尝试引入环境变量:

0 * * * * . /etc/profile; /usr/bin/php /var/www/script.php

crontab 无权限执行

须要注意的是crontab 任务的调度,只有 root 和任务全部者拥有权限。

若是想要编辑/查看/删除其余用户的任务,可使用如下命令:

$ crontab -u <username> <选项>

经常使用选项:
-e:编辑任务
-l:查看任务
-r:删除任务

查看 crontab 任务执行状况

当定时任务在指定时间执行时,会同步输出相似日志:

$ tail -f /var/log/syslog
Nov 19 12:47:01 gigabit CRON[14521]: (root) CMD (/usr/bin/php /var/www/script.php)

此时就能够确定任务调度正常。

上面那种方式确实有效,可是并不方便,那么有没有更好的方式呢?

crontab 默认没有任务的执行记录日志,可是能够经过其余方式手动建立日志文件。

0 * * * * . /etc/profile; /usr/bin/php /var/www/script.php >> /var/log/cron.log 2>&1

script.php 脚本最后面增长一次输出,这样每次执行完脚本就会将输出重定向至cron.log 日志文件了。

参考连接