Статьи

График работы Cron с драгоценным камнем Everyever

Релой Деспертадор ФО

Иногда нам приходится запускать задания с определенными интервалами, скажем, для резервного копирования журналов, отправки электронной почты и т. Д. В системах Unix мы можем планировать такие задачи с помощью встроенного демона cron Cron — это демон, используемый для выполнения запланированных задач. В системах Unix есть команда crontab , которая позволяет отдельным пользователям создавать запланированные задачи.

Cron ищет в своей области спула ( /var/spool/cron/crontabs К файлам в этом каталоге нельзя обращаться напрямую — для доступа к ним и их обновления должна использоваться команда crontab. Используйте следующую команду для редактирования вашего собственного файла crontab:

 $ crontab -e

Предположим, вы хотите делать резервную копию своего каталога журналов каждый день в 1:10. Добавьте следующую строку в файл crontab:

 10 1 * * * *  /path/to/your/backup/script.sh

Cron использует 10 1 * * * * Чтобы понять формат, вот сопоставление для каждого поля:

 * * * * * *
| | | | | |
| | | | | +-- Year              (range: 1900-3000)
| | | | +---- Day of the Week   (range: 1-7, 1 standing for Monday)
| | | +------ Month of the Year (range: 1-12)
| | +-------- Day of the Month  (range: 1-31)
| +---------- Hour              (range: 0-23, 1 in our example)
+------------ Minute            (range: 0-59, 10 in our example)

Звездочка ( * В нашем примере есть звездочки для дня месяца, месяца года, дня недели и года. Это означает, что команда будет выполняться каждый день месяца в каждом месяце года в каждый день недели в каждом году.

Однако непосредственно редактировать crontab довольно сложно, и обновлять crontab довольно сложно. Если вы работаете в проекте Ruby / Rails, есть замечательный гем, который называется всякий раз, когда его можно использовать для добавления и планирования задач в вашем crontab.

Давайте рассмотрим пример отправки ежедневного дайджеста по электронной почте пользователям. В этом случае у нас может быть такой почтовик:

 # file: app/mailers/user_mailer.rb

class UserMailer < ActionMailer::Base
  def digest_email_update(options)
    # ... email sending logic goes here
  end
end

Поскольку мы хотим отправить электронное письмо как отдельный процесс, давайте создадим задачу Rake для запуска электронной почты. Добавьте новый файл с именем email_tasks.rake в каталог lib / tasks вашего приложения на Rails:

 # file: lib/tasks/email_tasks.rake

desc 'send digest email'
task send_digest_email: :environment do
  # ... set options if any
  UserMailer.digest_email_update(options).deliver!
end

Среда send_digest_email: :environmentUserMailer

Теперь, запустив команду rake -T Проверьте все работает, запустив задачу и проверив, отправлено письмо или нет.

 rake send_digest_email

На данный момент у нас есть рабочая задача rake, которую можно запланировать с помощью crontab .

Всякий раз Gem

Установите гем всякий раз, добавив следующую строку в Gemfile :

 # file: Gemfile

gem 'whenever', require: false

Теперь свяжите:

 $ bundle

Перейдите в каталог проекта и выполните команду wheneverize

 $ wheneverize .

Это создаст файл schedule.rb в каталоге config вашего приложения Rails. Отредактируйте файл schedule.rb, чтобы запланировать задачу. Скажем, нам нужно отправлять дайджест по электронной почте каждый день в 22:00:

 # file: config/schedule.rb

every :day, at: '10pm' do
  # specify the task name as a string
  rake 'send_digest_email'
end

Выполнение команды whenever

 $ whenever

0 22 * * * /bin/bash -l -c 'cd /home/deepak/Work/testapp && RAILS_ENV=production bundle exec rake send_digest_email --silent'

## [message] Above is your schedule file converted to cron syntax; your crontab file was not updated.
## [message] Run `whenever --help' for more options.

Первая строка выходных данных — это фактическая команда, запускаемая ежедневно в 22:00. Эта команда будет запущена демоном cron после его записи в crontab.

Вы можете проверить созданное расписание, а затем обновить (записать) свой crontab, используя:

 $ whenever -w

[write] crontab file written

Это означает, что ваш crontab обновлен, вы можете проверить его, открыв файл crontab:

 $ crontab -e

Здесь вам будет предложено выбрать редактор по вашему выбору, а затем вы будете перенаправлены в этот редактор. Вы можете увидеть все существующие cronjobs для текущего вошедшего в систему пользователя.

Запускайте whenever --help

 $ whenever --help

Одна из полезных опций -f позволяет вам использовать другой файл расписания

 $ whenever -f /path/to/schedule/file/myschedule.rb

Чтобы очистить ваш crontab, выполните следующую команду:

 $ whenever -c

[write] crontab file

Эта команда очистит ваш файл crontab. Это полезно, если вы допустили ошибку или хотите прекратить работу cron.

Пользовательские типы работ

Каждый раз, когда гем предлагает три других типа заданий, помимо задач Rake: команда , бегун и грабли . Вы также можете создать свой собственный тип работы. В следующем примере я использую все эти три типа работы.

Тип задания бегуна позволяет вам вводить исполняемый фрагмент кода в виде строки, которая будет выполняться с определенным интервалом. Аналогично, команда принимает скрипт, который будет запускаться с интервалом, тогда как. Как вы уже знаете, rake запускает задачу Rake, определенную в вашем приложении.

 every 3.hours do
  runner 'User.expire_session_cache'
  rake 'rake_task_name'
  command '/usr/bin/command_name'
end

Предположим, вы хотите создать пользовательский тип задания. Во-первых, необходимо определить новый тип задания, например:

 job_type :foo, '/usr/local/bin/foo :task :filename'

После определения используйте этот новый тип задания следующим образом в schedule.rb :

 every 2.hours do
  foo 'somecommand', filename: 'inputfilepath'
end

Теперь команда foo/usr/local/bin/foo inputfilepath

Автоматизировать с Capistrano

Всякий раз, когда гем предоставляет рецепты Capistrano для автоматизации обновления файла crontab во время развертывания. Это простой вопрос, требующий наличия плагина в файле deploy:

 # file: config/deploy.rb

require 'whenever/capistrano'

set :whenever_environment, defer { stage }
set :whenever_command, 'bundle exec whenever'

Это оно. Теперь при развертывании Capistrano обновит ваш crontab.

Завершение

Основным преимуществом использования gem всякий раз, когда вам не нужно запоминать утомительный синтаксис crontab или обновлять crontab самостоятельно, что может быть опасно для существующих cronjobs в системе. Кроме того, всякий раз, когда используется файл сценария (например, schedule.rb ), который является простым Ruby, вы можете воспользоваться дружественным и читаемым синтаксисом Ruby. Обновление файла crontab среды развертывания с помощью задач Capistrano также очень приятно.

В общем, если у вас есть задания, которые должны выполняться по расписанию, использование Gem всякий раз, когда вы можете использовать возможности Unix с удобством Ruby.

Удачного кодирования.