143 lines
6.0 KiB
Plaintext
143 lines
6.0 KiB
Plaintext
== Introduction
|
|
|
|
Whenever is a Ruby gem that provides a clear syntax for writing and deploying cron jobs.
|
|
|
|
== Installation
|
|
|
|
$ gem install whenever
|
|
|
|
Or with Bundler in your Gemfile.
|
|
|
|
gem 'whenever', :require => false
|
|
|
|
== Getting started
|
|
|
|
$ cd /my/rails/app
|
|
$ wheneverize .
|
|
|
|
This will create an initial "config/schedule.rb" file you.
|
|
|
|
== Example schedule.rb file
|
|
|
|
every 3.hours do
|
|
runner "MyModel.some_process"
|
|
rake "my:rake:task"
|
|
command "/usr/bin/my_great_command"
|
|
end
|
|
|
|
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
|
|
|
|
every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
|
|
runner "Task.do_something_great"
|
|
end
|
|
|
|
More examples on the wiki: http://wiki.github.com/javan/whenever/instructions-and-examples
|
|
|
|
== Define your own job types
|
|
|
|
Whenever ships with three pre-defined job types: command, runner, and rake. You can define your own with `job_type`.
|
|
|
|
For example:
|
|
|
|
job_type :awesome, '/usr/local/bin/awesome :task :fun_level'
|
|
|
|
every 2.hours do
|
|
awesome "party", :fun_level => "extreme"
|
|
end
|
|
|
|
Would run `/usr/local/bin/awesome party extreme` every two hours. `:task` is always replaced with the first argument, and any additional `:whatevers` are replaced with the options passed in or by variables that have been defined with `set`.
|
|
|
|
The default job types that ship with Whenever are defined like so:
|
|
|
|
job_type :command, ":task :output"
|
|
job_type :rake, "cd :path && RAILS_ENV=:environment rake :task :output"
|
|
job_type :runner, "cd :path && script/runner -e :environment ':task' :output"
|
|
|
|
If a script/rails file is detected (like in a Rails 3 app), runner will be defined to fit:
|
|
|
|
job_type :runner, "cd :path && script/rails runner -e :environment ':task' :output"
|
|
|
|
If a `:path` is not set it will default to the directory in which `whenever` was executed. `:environment` will default to 'production'. `:output` will be replaced with your output redirection settings which you can read more about here: http://github.com/javan/whenever/wiki/Output-redirection-(logging-your-cron-jobs)
|
|
|
|
All jobs are by default run with `bash -l -c 'command...'`. Among other things, this allows your cron jobs to play nice with RVM by loading the entire environment instead of cron's somewhat limited environment. Read more: http://blog.scoutapp.com/articles/2010/09/07/rvm-and-cron-in-production
|
|
|
|
You can change this by setting your own job_template.
|
|
|
|
set :job_template, "bash -l -c ':job'"
|
|
|
|
Or set the job_template to nil to have your jobs execute normally.
|
|
|
|
set :job_template, nil
|
|
|
|
== Cron output
|
|
|
|
$ cd /my/rails/app
|
|
$ whenever
|
|
|
|
And you'll see your schedule.rb converted to cron sytax. Note: running `whenever' with no options does not display your current crontab file, it simply shows you the output of converting your schedule.rb file.
|
|
|
|
== Capistrano integration
|
|
|
|
In your "config/deploy.rb" file do something like:
|
|
|
|
after "deploy:symlink", "deploy:update_crontab"
|
|
|
|
namespace :deploy do
|
|
desc "Update the crontab file"
|
|
task :update_crontab, :roles => :db do
|
|
run "cd #{release_path} && whenever --update-crontab #{application}"
|
|
end
|
|
end
|
|
|
|
This will update your crontab file, leaving any existing entries unharmed. When using the `--update-crontab` option, Whenever will only update the entries in your crontab file related to the current schedule.rb file. You can replace the `#{application}` with any identifying string you'd like. You can have any number of apps deploy to the same crontab file peacefully given they each use a different identifier.
|
|
|
|
If you wish to simply overwrite your crontab file each time you deploy, use the `--write-crontab` option. This is ideal if you are only working with one app and every crontab entry is contained in a single schedule.rb file.
|
|
|
|
By mixing and matching the `--load-file` and `--user` options with your various :roles in Capistrano it is entirely possible to deploy different crontab schedules under different users to all your various servers. Get creative!
|
|
|
|
If you want to override a variable (like your environment) at the time of deployment you can do so with the `--set` option: http://wiki.github.com/javan/whenever/setting-variables-on-the-fly
|
|
|
|
== Discussion / Feedback / Issues / Bugs
|
|
|
|
For general discussion and questions, please use the google group: http://groups.google.com/group/whenever-gem
|
|
|
|
If you've found a genuine bug or issue, please use the Issues section on github: http://github.com/javan/whenever/issues
|
|
|
|
Ryan Bates created a great Railscast about Whenever: http://railscasts.com/episodes/164-cron-in-ruby
|
|
It's a little bit dated now, but remains a good introduction.
|
|
|
|
== Credit
|
|
|
|
Whenever was created for use at Inkling (http://inklingmarkets.com) where I work. Their take on it: http://blog.inklingmarkets.com/2009/02/whenever-easy-way-to-do-cron-jobs-from.html
|
|
|
|
== License
|
|
|
|
Copyright (c) 2009+ Javan Makhmali
|
|
|
|
Permission is hereby granted, free of charge, to any person
|
|
obtaining a copy of this software and associated documentation
|
|
files (the "Software"), to deal in the Software without
|
|
restriction, including without limitation the rights to use,
|
|
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the
|
|
Software is furnished to do so, subject to the following
|
|
conditions:
|
|
|
|
The above copyright notice and this permission notice shall be
|
|
included in all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
OTHER DEALINGS IN THE SOFTWARE.
|