Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is Rails's "delayed_job" for cron task really?

delayed_job is at http://github.com/collectiveidea/delayed_job

Can delayed_job have the ability to do cron task? Such as running a script every night at 1am. Or run a script every 1 hour.

If not, what are the suitable gems that can do that? And can it be monitored remotely using a browser, and have logging of success and error?

like image 396
nonopolarity Avatar asked Sep 02 '10 23:09

nonopolarity


4 Answers

I worked on a project that tried to use DelayedJob to schedule future items. It sucked.

Instead I recommend you use the whenever gem:

http://github.com/javan/whenever

Whenever is a Ruby gem that provides a clear syntax for defining cron jobs. It outputs valid cron syntax and can even write your crontab file for you. It is designed to work well with Rails applications and can be deployed with Capistrano. Whenever works fine independently as well.

Code looks like this (from github)

  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

Here's a RailsCast video on how to use it.

And the corresponding ASCIICast.

like image 82
marshally Avatar answered Nov 19 '22 23:11

marshally


I think cron is a better tool for this than delayed_job. I've used it in a project before, and it really excels at running at task in the background or at a particular time. But, for recurring tasks that happen at regular times, I think cron is the best tool.

Check out whenever (and its Railscast) to easily schedule cron jobs that can run rake tasks (or thor, or shell scripts, or anything else.) You can use the rake tasks to update your models and then have some sort of dashboard controller that looks at the various statuses.

like image 36
Dan McNevin Avatar answered Nov 19 '22 23:11

Dan McNevin


You can also use the ClockWork gem: https://github.com/adamwiggins/clockwork-rails-dj

Clockwork runs as a separate daemon and can be used to trigger jobs of any sort that either getting added to a job queueing system or run right away.

Use Delayed_Job for what it's good for, a job queueing system which can be distributed over multiple nodes (or not). Use something else to add jobs to the queue at the right time.

I was using rake(or runner)/cron/whenever gem to schedule background tasks but was finding my server load was just so high because I would be getting hit constantly with rake/runner loading up the rails environment. Delayed_Job workers are your rails daemons that stay running so you aren't constantly firing up Rails every time a background task is required.

like image 3
cpuguy83 Avatar answered Nov 19 '22 22:11

cpuguy83


Whenever works great.

I also like rufus-scheduler

/config/initializers/task_scheduler.rb

Then in that file:

scheduler = Rufus::Scheduler.start_new  

scheduler.every("1m") do  
   DailyDigest.send_digest!  
end 

I originally found this posted here

I've tried it and it works well.

update

Now that I look back at that link it's pretty much the only rails company that I would want to work for. They have made some many gems and add such much to the community. Not to mention they have a huge team!

like image 2
thenengah Avatar answered Nov 19 '22 21:11

thenengah