crontab 与 whenever

crontab 与 whenever

FROM:http://www.jianshu.com/p/e35ecf699235

一、什么是crontab

crontab 命令常见于Unix 和 类Unix的操作系统中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于 crontab 文件中,一共之后读取和执行。该词来源于希腊语,愿意市时间。crontab存储的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为 cron jobs

二、crontab 参数

使用 crontab 需要5个数字来定时时间,最后一个位置为命令占位。
具体数字如下

-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

参考:

whenever github
百度百科

Comments are closed.