Linux 命令之 crontab
crontab 简介
crontab 主要用于需要管理周期执行定时任务的场景
crontab 安装
(有些系统默认已经带了 crontab,无需安装的朋友可以直接跳过本节)
安装:
yum install -y vixie-cron
yum install -y crontabs
启动:
systemctl start crond.service
重启:
systemctl restart crond.service
设置开机启动:
systemctl enable crondservice
命令格式
crontab 主要有以下几种命令格式
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
crontab -n [ hostname ]
crontab -c
我们发现crontab 的命令还挺多的,我们先从最常用的开始:
crontab -e
这个命令用于编辑定时任务列表,当我们输入完命令,按下回车键之后,它会使用默认编辑器(通常是vi/vim)打开一个文件,里面的内容可能是这样子的:

这很可能是你看到的,在设置任何定时任务之前,这里是看不到任何内容的,如果你已经设置了内容的话,那么看到的可能是这样的

这是我提前设置好的定时任务,我们暂时不解释这个配置的功能,但从这里可以知道,通过 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
man cronman crontab- crontab校验工具及语法介绍
- crontab 脚本错误日志和正确的输出写入到文件
Linux 命令之 crontab的更多相关文章
- Linux命令之Crontab定时任务,利用Crontab定时执行spark任务
Linux命令之Crontab定时任务,利用Crontab定时执行spark任务 一.Linux命令之Crontab定时任务 1.1 常见Crontab任务 1.1.1 安装crontab 1.1.2 ...
- 工作中常用的Linux命令:crontab命令
本文链接:http://www.cnblogs.com/MartinChentf/p/6060252.html (转载请注明出处) crontab是一个用来设置.删除或显示供守护进程cron执行的定时 ...
- 每天一个linux命令(56)--crontab命令
上一节学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,Linux 系统则是由 cron(crond)这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个 ...
- linux命令之crontab详解
crontab命令: crontab -l : 显示定时任务列表 crontab -e: 编辑定时任务 crontab -r : 删除所有定时任务 基本格式 : * * * * * command ...
- linux命令之crontab定时执行任务
一.crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动c ...
- linux命令之crontab定时执行任务【转】
本文转载自:https://www.cnblogs.com/coffy/p/5608095.html 一.crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护 ...
- linux命令:crontab命令(转)
一.crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动cro ...
- Linux命令之crontab
crontab [-u user] file crontab [-u user] [-l | -r | -e] [-i] [-s] crontab命令被用来提交和管理用户需要周期性执行的任务,与win ...
- linux 命令:crontab
一.crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动c ...
随机推荐
- 虚拟机ubuntu 网速慢的解决方法
其实虚拟机网速慢,我觉得就两个限制因素.一个是虚拟机的内存,内存小了,上传和下载的速率就慢了,就像内存小的虚拟机跑得慢是一个道理:还有一个就是网络连接方式,这里我使用的是桥接,之前我使用的NAT模式, ...
- Spring Boot (八): Mybatis 增强工具 MyBatis-Plus
1. 简介 在上一篇文章<Spring Boot (七): Mybatis极简配置> 中我们介绍了在 Spring Boot 中 Mybatis 的基础使用方式,其中有一部分美中不足的是 ...
- .Net Core Serverless初体验
什么是Serverless Serverless 是一个当今软件世界中比较新的话题.它并没有一个普遍公认的权威定义,每个人每个企业对它的解释可能都有不同,而 Serverless 正是在这种情况下不断 ...
- A-03 牛顿法和拟牛顿法
目录 牛顿法和拟牛顿法 一.牛顿法详解 1.1 无约束最优化问题 1.2 牛顿法迭代公式 1.3 牛顿法和梯度下降法 二.牛顿法流程 2.1 输入 2.2 输出 2.3 流程 三.拟牛顿法简介 更新. ...
- Python 元组(Tuple)操作详解
Python的元组与列表类似,不同之处在于元组的元素不能修改,元组使用小括号, 列表使用方括号,元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可 一.创建元组 代码如下: tup1 = (' ...
- python编程基础之二十五
匿名函数:不用def 定义的函数,没有函数名 lambda只是一个表达式,函数体比def简单的多 lambda的函数体不再是代码块 lambda只有一行,增加运行效率 lambda [参数1][参数2 ...
- 学以致用,通过字节码理解:Java的内部类与外部类之私有域访问
目录: 内部类的定义及用处 打开字节码理解内部类 一.内部类的定义及用处 内部类(inner class)是定义在另一个类中的类.使用内部类,我们可以: 访问该类定义所在的作用域中的数据,包括私有的数 ...
- django开发中关于外键设置
django开发中关于外键设置 我们建模型的时候会用到ForeignKey 而由于外键的约数会导致一些保存 所有我们ctrl+左键进入源码 源码 def __init__(self, to, on_d ...
- Flask中多APP应用以及admin后台系统
一.多APP from werkzeug.wsgi import DispatcherMiddleware from werkzeug.serving import run_simple from f ...
- Nmon监控结果分析
一:CPU信息 SYS_SUMM图表: 1.折线图中蓝线为cpu占有率变化情况:粉线为磁盘IO的变化情况: 2.下面表各种左边的位磁盘的总体数据,包括如下几个: Avg tps during an i ...