Запланируйте работу на 15-й и последний день месяца в ruby - PullRequest
2 голосов
/ 27 января 2020

Я определил задачу rake для работы 15-го и последнего дня месяца в 8 часов утра в файле schedule.rb. Я просто хотел подтвердить, правильно ли я это сделал. Пожалуйста, посмотрите и предложите его.

запускать эту задачу в 8:00 15-го числа каждого месяца

every '0 8 15 * *' do
  rake 'office:reminder', environment: ENV['RAILS_ENV']
end

запускать эту задачу в 8:00 в последний день каждого месяца

every '0 8 28-31 * *' do
  rake 'office:reminder', environment: ENV['RAILS_ENV']
end

Ответы [ 2 ]

0 голосов
/ 28 января 2020

cron обычно не позволяет указывать «последний день месяца». Но в Ruby вы можете просто использовать -1 для обозначения последнего дня месяца:

Date.new(2020, 2, -1)
#=> Sat, 29 Feb 2020

Таким образом, вместо отдельных записей для определенных c дней, вы можете определить одну запись, выполняющуюся каждый день. в 8:00 и передайте дни как аргументы в задачу rake:

every '0 8 * * *' do
  rake 'office:reminder[15,-1]', environment: ENV['RAILS_ENV']
end

Затем в вашей задаче вы можете превратить эти аргументы в объекты даты и проверить, равен ли какой-либо из них сегодняшняя дата:

namespace :office do
  task :reminder do |t, args|
    days = args.extras.map(&:to_i)
    today = Date.today
    if days.any? { |day| today == Date.new(today.year, today.month, day) }
      # send your reminder
    end
  end
end
0 голосов
/ 27 января 2020

Поскольку cron имеет очень простой интерфейс, трудно донести до него такое понятие, как «последний день месяца», без посторонней помощи. Но вы можете переместить свою логику c в задачу:

every '0 8 28-31 * *' do
  rake 'office:end_of_month_reminder', environment: ENV['RAILS_ENV']
end

И в новой задаче под названием office: end_of_month_reminder:

if Date.today.day == Date.today.end_of_month.day
  #your task here
else
  puts "not the end of the month, skipping"
end

У вас все равно будет первый месячное задание. Но если вы хотите свернуть это в одно:

every '0 8 15,28-31 * *' do
  rake 'office:reminder', environment: ENV['RAILS_ENV']
end

И в вашем задании:

if (Date.today.day == 15) || (Date.today.day == Date.today.end_of_month.day) 
  #your task here
else
  puts "not the first or last of the month, skipping"
end
...