Giter VIP home page Giter VIP logo

crono's Introduction

Crono โ€” Job scheduler for Rails

Gem Version Build Status Code Climate security Join the chat at https://gitter.im/plashchynski/crono

Crono is a time-based background job scheduler daemon (just like Cron) for Ruby on Rails.

The Purpose

Currently there is no such thing as Ruby Cron for Rails. Well, there's Whenever but it works on top of Unix Cron, so you haven't control of it from Ruby. Crono is pure Ruby. It doesn't use Unix Cron and other platform-dependent things. So you can use it on all platforms supported by Ruby. It persists job states to your database using Active Record. You have full control of jobs performing process. It's Ruby, so you can understand and modify it to fit your needs.

Web UI

Requirements

Tested with latest MRI Ruby (2.2, 2.1 and 2.0) and Rails 3.2+
Other versions are untested but might work fine.

Installation

Add the following line to your application's Gemfile:

gem 'crono'

Run the bundle command to install it.
After you install Crono, you can run the generator:

rails generate crono:install

It will create a configuration file config/cronotab.rb and migration
Run the migration:

rake db:migrate

Now you are ready to move forward to create a job and schedule it.

Usage

Create Job

Crono can use Active Job jobs from app/jobs/. The only requirements is that the perform method should take no arguments.

Here's an example of a job:

# app/jobs/test_job.rb
class TestJob < ActiveJob::Base
  def perform
    # put you scheduled code here
    # Comments.deleted.clean_up...
  end
end

The ActiveJob jobs is convenient because you can use one job in both periodic and enqueued ways. But Active Job is not required. Any class can be used as a crono job if it implements a method perform without arguments:

class TestJob # This is not an Active Job job, but pretty legal Crono job.
  def perform
    # put you scheduled code here
    # Comments.deleted.clean_up...
  end
end

Here's an example of a Rake Task within a job:

# config/cronotab.rb
require 'rake'
# Be sure to change AppName to your application name!
AppName::Application.load_tasks

class Test
  def perform
    Rake::Task['crono:hello'].invoke
  end
end

Crono.perform(Test).every 5.seconds

With the rake task of:

# lib/tasks/test.rake
namespace :crono do
  desc 'Update all tables'
  task :hello => :environment do
    puts "hello"
  end
end

Please note that crono uses threads, so your code should be thread-safe

Job Schedule

Schedule list is defined in the file config/cronotab.rb, that created using crono:install. The semantic is pretty straightforward:

# config/cronotab.rb
Crono.perform(TestJob).every 2.days, at: {hour: 15, min: 30}
Crono.perform(TestJob).every 1.week, on: :monday, at: "15:30"

You can schedule one job a few times, if you want the job to be performed a few times a day or a week:

Crono.perform(TestJob).every 1.week, on: :monday
Crono.perform(TestJob).every 1.week, on: :thursday

The at can be a Hash:

Crono.perform(TestJob).every 1.day, at: {hour: 12, min: 15}

Run daemon

To run Crono daemon, in your Rails project root directory:

bundle exec crono RAILS_ENV=development

crono usage:

Usage: crono [options]
    -C, --cronotab PATH              Path to cronotab file (Default: config/cronotab.rb)
    -L, --logfile PATH               Path to writable logfile (Default: log/crono.log)
    -P, --pidfile PATH               Path to pidfile (Default: tmp/pids/crono.pid)
    -d, --[no-]daemonize             Daemonize process (Default: false)
    -e, --environment ENV            Application environment (Default: development)

Web UI

Crono comes with a Sinatra application that can display the current state of Crono jobs.
Add sinatra and haml to your Gemfile

gem 'haml'
gem 'sinatra', require: nil

Add the following to your config/routes.rb:

Rails.application.routes.draw do
    mount Crono::Web, at: '/crono'
    ...

Access management and other questions described in the wiki.

Capistrano

Use the capistrano-crono gem (github).

Support

Feel free to create issues

License

Please see LICENSE for licensing details.

crono's People

Contributors

plashchynski avatar michaelachrisco avatar trevoke avatar chandravati avatar miroslavcsonka avatar gitter-badger avatar thomasfedb avatar

Watchers

Simon Levin avatar Zvika Naveh avatar James Cloos avatar Idan Belassen avatar  avatar  avatar Elad Reuven Katz avatar Yarin Goldman avatar  avatar Omri Shaiko avatar  avatar Keren K avatar NIPUB For ruby gems avatar Sefi Eini avatar Yuval Steinberg avatar David avatar  avatar  avatar Meital avatar Zachary Erskine avatar Shahar Shelly avatar  avatar Nativ Ben-David avatar Idan-Magled avatar Yuval Dvir avatar  avatar  avatar dikla1809 avatar  avatar  avatar Kobi Shitrit avatar David Ron avatar  avatar  avatar  avatar Doron Eli avatar  avatar Liza avatar  avatar Itai Ganot avatar  avatar Gal Zakut avatar  avatar  avatar  avatar  avatar meir.kempler avatar  avatar Tomer Barak avatar  avatar Nick Glushchenko avatar  avatar  avatar Denisa avatar  avatar  avatar Ran Kiselstein avatar Guy Peer avatar Doron Tabakman avatar  avatar Moran Zabatani avatar  avatar Eli Sivan avatar  avatar Michael avatar Andrew Talalai avatar  avatar Andrii avatar Kirill Nazarenko avatar  avatar Vadym Momotiuk avatar  avatar  avatar Simon Faiman avatar  avatar  avatar Tal Avissar avatar Sun Dery avatar  avatar  avatar  avatar Tomer Sade avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.