Linux 命令之 crontab

crontab 简介

crontab 主要用于须要管理周期执行定时任务的场景shell

crontab 安装

(有些系统默认已经带了 crontab,无需安装的朋友能够直接跳过本节)vim

安装:服务器

yum install -y vixie-cron
yum install -y crontabs

启动:编辑器

systemctl start crond.service

重启:
systemctl restart crond.service工具

设置开机启动:测试

systemctl enable crondservice

命令格式

crontab 主要有如下几种命令格式.net

crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
crontab -n [ hostname ]
crontab -c

咱们发现crontab 的命令还挺多的,咱们先从最经常使用的开始:3d

crontab -e

这个命令用于编辑定时任务列表,当咱们输入完命令,按下回车键以后,它会使用默认编辑器(一般是vi/vim)打开一个文件,里面的内容多是这样子的:
rest

这极可能是你看到的,在设置任何定时任务以前,这里是看不到任何内容的,若是你已经设置了内容的话,那么看到的多是这样的
日志

这是我提早设置好的定时任务,咱们暂时不解释这个配置的功能,但从这里能够知道,经过 crontab -e 咱们能够编辑定时任务。
若是咱们什么都不作,直接退出编辑器会看到如下提示:

若是咱们修改了这个文件,好比增长了一个任务

保存退出以后,咱们能够看到成功的提示:

若是说,咱们的配置有误,那么系统就会提示咱们, 从新编辑,你能够输入 y从新编辑 或者 n放弃刚刚的配置的内容

crontab -l

这个命令能够列出当前的定时任务内容, 这与咱们使用 crontab -e 看到的内容同样,不一样的是 crontab -e 能够编辑,而这里只能查看

crontab -r

这个命令用于删除任务列表里面的内容(在删除以前咱们先作一个备份)

经过上面的示例能够看出,执行完 crontab -r 以后,咱们的任务列表被清空了

crontab file

这个命令用于将保存在某个文件中的任务列表中的内容覆盖到咱们的任务列表中,咱们刚刚在删除任务列表前作了备份
如今来看一下,使用命令可否将任务列表还原回去

能够看到,经过 crontab file 命令,咱们将刚刚备份的文件内容恢复到任务列表当中了。
有两点须要注意:

  • 这个命令的操做很粗暴,会用指定文件的内容直接覆盖任务列表,使用前必定要想清楚,最好在操做前进行备份
  • 用于覆盖的文件内容必须是合法的内容,若是语法有误,内容将不会更新,且会获得下图所示的错误提示

crontab -ri

这个命令用于删除任务列表里面的内容,但会在删除以前让你确认是否删除

你能够输入 y 确认删除,也能够输入 n 取消此次操做

crontab -u user_name

这里咱们补充一点,Linux 中的每一个用户均可以有本身的定时任务,他们设置的任务被保存在 /var/spool/cron/ 目录下的同名文件中

这个命令跟 -i 同样,须要与其它命令配合使用

crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]

不使用 -u 时默认的就是当前用户,若是你要配置其它用户的任务列表
就可使用这个命令

crontab -u user -e

固然,使用这个命令的前提是要有对应文件的操做权限,大多数状况下,这个命令都是 root 在用。

须要注意的是,根据文档提示,若是你从一个普通用户 su 到其它用户,在进行crontab 命令时,就必定要加上 -u 选项。但我实验发现,su到其它用户以后,再进行 crontab 操做,默认使用的 su 以后的用户。

任务列表的语法

接这部分是最重要的任务规则配置环节


上面这个截图是 /etc/crontab 文件的内容,使用 crontab -e 编辑的语法也这个基本同样,差异只有 user-name 一项。

使用 crontab -e 无需指定用户名称,由于这个命令就是使用用户本身的身份来执行的。

补充: /etc/crontab 中的内容只能由 root 来设置,通常用于设置系统级的周期任务

从上面的图里面能够知道,周期任务的配置语法由两部分组成(使用 contab -e 时忽略 user-name)

  • 时间规则
  • 要执行命令或者脚本

时间规则

前面5个 * 分别表明 分、时、日、月、周

  • 第一个 * 表明每一分钟,也能够是 0-59 区间中的数字
  • 第二个 * 表明每一个小时,也能够是 0-23 区间中的数字
  • 第三个 * 表明一个月中的每一天,也能够是 1-31 区间中的数字
  • 第四个 * 表明一年中的每月, 也能够是 1-13 区间中的数字,或者使用英文 jan,feb,mar,apr... 等来表示
  • 第五个 * 表明一周中的每一天, 也能够是 0-6 区间中的数字(星期天使用 0 或者 7 表示),也可使用 sum,mon,tue,wed,thu,fri,sat 来表示

除了上面的配置方式以外,crontab 还支持更灵活的配置方式:

  • * 每一个时间点,如在分钟单位,则表示每分钟执行一次,其它时间点同理
  • , 用于链接多个时间点,如 1,3,5 指定1,3,5这三个时间点
  • - 用于肯定时间区间,如 2-6 等价于 2,3,4,5,6
  • / 用于每隔一个时间段执行一次,如在分钟位置设置 */2 表示每两分钟执行一次

注意,上述符号中的非标准符号不必定能在你的机器上正常运行,在使用前必定要先进行测试

命令

能够是shell命令或者执行某个已经写好的脚本

实例

如下举几个实例的例子

# 表示每分钟执行一次
* * * * * cmd

# 每一个小时的0分和30分执行各执行一次
0,30 * * * * * cmd

# 天天的2点到5点每一个小时的整点执行
0 2-5 * * * cmd

# 每一年的 1月1日0点执行
0 0 1 1 * cmd

# 天天的12点到18点每隔3小时执行一次
0 12-18/3 * * * cmd

# 每月最后的天的22点整执行(非标准语法,要先进行测试再投入生产环境)
0 22 L * * cmd

cron.allow 与 cron.deny

执行cron任务的权限是能够经过 /etc/cron.allow/etc/cron.deny 两个文件进行配置。

  • cron.allow 用于配置哪些用户可使用 crontab
  • cron.deny 用于配置哪些用户禁止使用 crontab

这两个文件的内容为每一行一个用户名,或者为空

  • 若是 cron.allow 文件存在的话,须要限权的用户名必须在这个文件里面
  • 若是 cron.deny 文件存在的话,须要权限的用户不能出如今这个文件里面
  • 若是两个文件都不存在的话,则只有 root 有权限使用 crontab

当上述两个文件都不存在时,一个普通使用执行 crontab 命令会获得如下错误

环境变量

在实际使用过程当中, 咱们都会编辑好一个.sh文件,设置好权限(通常是增长执行权限 chmod +x task.sh
测试成功以后,兴高采烈地把它添加到 crontab 的任务列表里面,结果迟迟没有获得预期结果。
我以前碰到这样的状况,直接执行脚本没问题,但使用 crontab 执行却报错,查看日志发现是环境变量的问题。
解决的办法很简单,只要在脚本内提早导入环境变量便可:

执行结果保存

设置完任务列表以后,咱们最关心的主是任务的执行状况
能够在配置任务的时候,在最后加入如下将执行过程当中输出的内容保存到本身想要的地方。

*/5 * * * * cmd > /var/log/cron_task.log 2>&1 &

语法解析详见 crontab 脚本错误日志和正确的输出写入到文件

日志文件

咱们能够查看 /var/log/cron文件的内容来查看服务器执行了哪些任务
(个人是CentOS, 若是是Ubuntu能够到/var/log/cron.log查看)

待补充

如下几点是我看了文档以后还不太明白的几点(主要仍是英文水平还不够。。)

  • crontab [-u user] -s
  • crontab -n [hostname]
  • crontab -c
  • /etc/crontab 和 /etc/cron.d 文件内也能够设置任务列表,具体的使用场景我尚未接触过

以上全部内容是结合本身的实践与官方文档加上网友们的文章写成,还有不少本身不理解的,但愿看到的朋友若是有知道的也评论告诉我哦,谢谢啦

ReadMore

相关文章
相关标签/搜索