一、什么是crontab
crontab
命令常见于Unix 和 类Unix的操作系统中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于 crontab
文件中,一共之后读取和执行。该词来源于希腊语,愿意市时间。crontab
存储的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为 cron jobs
二、crontab 参数
使用 crontab
需要5个数字来定时时间,最后一个位置为命令占位。
具体数字如下
![](http://yannini.qiniudn.com/c2cec3fdfc03924585e5aeff8794a4c27c1e25e9.jpg)
-e [UserName]: 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
-r [UserName]: 删除目前的时程表
-l [UserName]: 列出目前的时程表
-v [UserName]:列出用户cron作业的状态
在以上各个字段中,还可以使用以下特殊字符:
星号():代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。*
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如/10,如果用在minute字段,表示每十分钟执行一次。*
三、crontab 实例
-
每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
-
每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
-
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt
-
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line
-
1月1日早上4点
0 4 1 1 * command line
每次,我都需要适用crontab -e
来编辑定时任务。并且crontab
自带的数字表达式不太好理解。所以,就出现了 whenever
。
四、什么是whenever
官方的解释
Whenever is a Ruby gem that provides a clear syntax for writing and deploying cron jobs.
简单来说,就是whenever
是一个用来写定时任务的 Ruby Gem
。可以适用DSL
方式来书写定时任务。Rubiest
真实幸福啊!!
1、安装Gem
gem install whenever
或者
gem 'whenever', :require => false
2、初始化
进入到你的Rails
项目中执行
wheneverize .
执行完毕,会生成一个config/schedule.rb
, 所有的定时任务的DSL
都可以在该文件中编写
3、常用命令
-i [identifier] 更新新定时任务,默认更新 schedule.rb 文件中的全部
-w, --write-crontab [identifier] 写定时任务,默认更新 schedule.rb 文件中的全部
-c, --clear-crontab [identifier] 清除 crontab
-v, --version 查看版本
五、whenever实例
## 每三个小时执行定时任务
every 3.hours do
runner "MyModel.some_process"
rake "my:rake:task"
command "/usr/bin/my_great_command"
end
## 每天的 4.30 执行定时任务
every 1.day, :at => '4:30 am' do
runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end
## 每一个小时执行定时任务
every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
runner "SomeModel.ladeeda"
end
## 每个月的27~31 号执行
every '0 0 27-31 * *' do
command "echo 'you can use raw cron syntax too'"
end
参考: