Как написать работу cron - PullRequest
       30

Как написать работу cron

0 голосов
/ 27 февраля 2020

Я пытаюсь настроить работу cron без использования «Всякий раз» в среде разработки. Я проверил журнал, и cron, кажется, работает каждые 2 минуты, но письмо не отправлялось ... Как правильно написать задание cron?

models / box.rb:

def self.reminder_mail
    @boxes = Box.all
    @boxes.each do |box|
      if box.status == "PENDING"
          NoticeMailer.sendmail_reminder(box).deliver
      end
    end
  end

Crontab

*/2 * * * *  ubuntu /home/ubuntu/workspace/box/reminder_mail 

cronlog

Feb 25 11:10:01 ubuntu-xenial CRON[4599]: (ubuntu) CMD (ubuntu /home/ubuntu/workspace/box/reminder_mail)
Feb 25 11:10:01 ubuntu-xenial CRON[4598]: (CRON) info (No MTA installed, discarding output)
Feb 25 11:12:01 ubuntu-xenial CRON[4605]: (ubuntu) CMD (ubuntu /home/ubuntu/workspace/box/reminder_mail)

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Ваш cronlog дает вам объяснение: в вашей системе разработки нет MTA. MTA означает Mail Transfer Agent, системную службу, которая передает электронные письма, отправленные клиентами, например, задание cron.

Если вы можете, установите и настройте постфикс, который является очень популярным MTA.

Обновление

Ваш файл cron неверен, замените RAILS_ENV = production на первый, что-то как это RAILS_ENV=production rake reminder_task:reminder_email.

Кроме того, если ваш проект использует пакет, используйте RAILS_ENV=production bundle exec rake reminder_task:reminder_email - это позволит запустить задачу rake с доступом ко всем необходимым гемам и т. Д. c. Я думаю, вам не нужно менять рабочую директорию. Вместо этого поместите такую ​​строку в файл cron:

HOME=/path/to/your/project
0 голосов
/ 09 марта 2020

Я решил эту проблему! Важно записать рейк PATH в моем случае /home/ubuntu/.rbenv/shims непосредственно в PATH и не упоминать в задании cron.

*/2 * * * * ubuntu cd /home/ubuntu/workspace/box && RAILS_ENV=development bundle exec rake reminder_task:reminder_mail >> /home/ubuntu/workspace/box/log/cron.log

0 голосов
/ 27 февраля 2020

есть обходной путь, вы можете реализовать API и использовать curl для его выполнения с пользовательской авторизацией внутри метода, просто чтобы авторизовать запрос

, а затем добавить запрос curl в ваш crontab

*/2 * * * *  curl --silent {you can spesify if it was POST,GET..etc} http://example.com/{your API path}
...