Scheduling tasks using the Whenever Gem — Ruby On Rails


**Introduction About the Cron Job**

Hi Everyone! In this post, I want to share with you a little guide that will show you how to use cron jobs in a Ruby on Rails application.
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952337/e093575d-6f30-13ab-b149-b87f6ffe3c76.png)
## What’s a Cron Job?

A cron job is a process that is scheduled to run at a certain time (every minute, day, week, or month). On Unix systems, we can run and manage these types of processes using the **cron** tool. The info on the process that will run the **cron** tool is stored in a file called **crontab**.

Examples of the use of cron jobs are the following:

* Generate reports. e.g, a report of daily payments from an e-commerce application.

* Send reminders to users. e.g, sending offer reminders from an e-commerce application.

### Step 1：Install whenever gem
Gem Info : https://github.com/javan/whenever](https://github.com/javan/whenever 

    # Cronjobs
    gem 'whenever', require: false

### Step 2： Initialize whenever the gem

    cd /my-great-project
    bundle exec wheneverize .

add log file path in the schedule.rb

    # schedule.rb
    set :output, {:error => “log/cron_error_log.log”, :standard => “log/cron_log.log”}

### Step 3： Create a rake task

    touch lib/tasks/first_sample_task.rake

On our task, we will simply print a message.

    # lib/tasks/first_sample_task.rake
    desc 'First Whenever rake task'
    task first_sample_task: :environment do
      Rails.logger.info "First Sample Task"
    end

To see the rake tasks of our Rails application, we can use the following command.

    # See all tasks
    bundle exec rake --tasks

### Step 4： Add in the schedule file

The structure of a cron job is the following

    .--------------- minute (0-59) 
    |  .------------ hour (0-23)
    |  |  .--------- day of month (1-31)
    |  |  |  .------ month (1-12)
    |  |  |  |  .--- day of week (0-6) (sunday=0 or 7)  
    |  |  |  |  |
    *  *  *  *  *  command to execute

An example of how to define a cron job to execute every 15minutes

    # schedule.rb
    every '*/15 * * * *' do
      rake 'first_sample_task'
    end

> For Reference
> [https://crontab.guru/#*/15_*_*_*_*](https://crontab.guru/#*/15_*_*_*_*)

### Step 5：Update crontab

    whenever --update-crontab

    # crontab file 
    */15 * * * * /bin/bash -l -c 'cd OUR_PROJECT_PATH && RAILS_ENV=production bundle exec rake first_sample_task - silent >> log/cron_log.log 2>> log/cron_error_log.log'

If we see at our logs, we can see the following.

    # log/cron_log.log
    I, [2022-05-04T18:05:02.890007 #98613]  INFO -- : First Sample Task
    I, [2022-05-04T18:20:02.944687 #98649]  INFO -- : First Sample Task

### Step 6： Crontab important commands

    # get crontab list
    crontab -l

    # delete all crontab
    crontab -r

    # edit crontab
    crontab -e

### Step 7：For deployment
need to import whenever file in capfile and deploy.rb

    # capfile
    require 'whenever/capistrano'

    # deploy.rb
    require 'whenever'
    require 'whenever/capistrano'

If this guide has been helpful to you and your team please share it with others!