Rails 환경에서 예약 된 작업을 실행하는 가장 좋은 방법은 무엇입니까? 스크립트 / 러너? 갈퀴? 몇 분마다 작업을 실행하고 싶습니다.
답변
레이크 접근 방식을 사용하고 있습니다 ( heroku 지원 )
lib / tasks / cron.rake 파일이 있습니다.
task :cron => :environment do
puts "Pulling new requests..."
EdiListener.process_new_messages
puts "done."
end
명령 행에서 실행하려면 “rake cron”입니다. 그런 다음이 명령을 원하는대로 운영 체제 cron / 작업 스케줄러에 넣을 수 있습니다.
이것은 오래된 질문과 답변입니다 업데이트 ! 몇 가지 새로운 정보 :
- 내가 참조한 heroku cron 서비스는 이후 Heroku Scheduler 로 대체되었습니다.
- 빈번한 작업 (특히 Rails 환경 시작 비용을 피하려는 경우)에서 선호하는 접근 방식은 시스템 크론을 사용하여 (a) 백그라운드에서 필요한 작업을 호출하기 위해 보안 / 개인 웹 후크 API를 찌르는 스크립트를 호출하는 것입니다. 또는 (b) 선택한 대기열 시스템에서 작업을 직접 대기열에 추가
답변
나는 예약 된 작업에 크게 의존하는 프로젝트를 할 때마다 매우 인기가 많았 습니다. crontab 형식을 처리하지 않고 예약 된 작업을 정의 할 수있는 훌륭한 DSL을 제공합니다. 읽어보기에서 :
cron 작업을 작성하고 배포하기위한 명확한 구문을 제공하는 Ruby gem 일 때마다.
README의 예 :
every 3.hours do
runner "MyModel.some_process"
rake "my:rake:task"
command "/usr/bin/my_great_command"
end
every 1.day, :at => '4:30 am' do
runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end
답변
프로젝트에서 우리는 보석을 사용할 때마다 처음 사용했지만 몇 가지 문제에 직면했습니다.
그런 다음 RUFUS SCHEDULER gem으로 전환하여 Rails에서 작업을 예약하는 데 매우 쉽고 신뢰할 수있는 것으로 나타났습니다.
우리는 매주 및 매일 메일을 보내거나주기적인 레이크 작업이나 방법을 실행하는 데 사용했습니다.
이것에 사용되는 코드는 다음과 같습니다
require 'rufus-scheduler'
scheduler = Rufus::Scheduler.new
scheduler.in '10d' do
# do something in 10 days
end
scheduler.at '2030/12/12 23:30:00' do
# do something at a given point in time
end
scheduler.every '3h' do
# do something every 3 hours
end
scheduler.cron '5 0 * * *' do
# do something every day, five minutes after midnight
# (see "man 5 crontab" in your terminal)
end
답변
작업을 완료하는 데 시간이 오래 걸리지 않는다고 가정하면 각 작업에 대한 작업으로 새 컨트롤러를 만드십시오. 태스크의 논리를 컨트롤러 코드로 구현 한 다음 wget을 사용하여이 컨트롤러의 URL을 호출하고 적절한 시간 간격으로 조치를 수행하는 OS 레벨에서 cronjob을 설정하십시오. 이 방법의 장점은 다음과 같습니다.
- 일반 컨트롤러처럼 모든 Rails 객체에 완전히 액세스 할 수 있습니다.
- 정상적인 행동을하는 것처럼 개발하고 테스트 할 수 있습니다.
- 간단한 웹 페이지에서 작업 adhoc을 호출 할 수도 있습니다.
- 추가 루비 / 레일 프로세스를 실행하여 더 이상 메모리를 사용하지 마십시오.
답변
스크립트 / 러너 및 레이크 작업은 크론 작업으로 실행하기에 완벽합니다.
cron 작업을 실행할 때 반드시 기억해야 할 중요한 사항이 있습니다. 아마도 앱의 루트 디렉토리에서 호출되지 않을 것입니다. 즉, 파일에 대한 모든 요구 사항 (라이브러리와 달리)은 명시 적 경로 (예 : File.dirname (__ FILE__) + “/ other_file”)를 사용하여 수행해야합니다. 이것은 또한 다른 디렉토리에서 명시 적으로 호출하는 방법을 알아야한다는 것을 의미합니다
코드가 다른 디렉토리에서 실행될 수 있는지 확인하십시오.
# from ~
/path/to/ruby /path/to/app/script/runner -e development "MyClass.class_method"
/path/to/ruby /path/to/rake -f /path/to/app/Rakefile rake:task RAILS_ENV=development
또한 크론 작업은 아마도 실행되지 않을 것이므로 .bashrc에 넣은 바로 가기에 의존하지 마십시오. 그러나 그것은 단지 표준 cron 팁입니다
답변
언제나 (그리고 cron)의 문제는 그것이 실행될 때마다 레일 환경을 다시로드한다는 것입니다. 이것은 작업이 빈번하거나 초기화 작업이 많이 필요한 실제 문제입니다. 이로 인해 생산에 문제가 있었고 경고해야합니다.
Rufus 스케줄러가 나를 위해합니다 ( https://github.com/jmettraux/rufus-scheduler )
실행할 작업이 길면 delayed_job ( https://github.com/collectiveidea/delayed_job ) 과 함께 사용합니다.
이게 도움이 되길 바란다!
답변
나는 resque / resque 스케줄러 의 큰 팬입니다 . cron과 유사한 반복 작업뿐만 아니라 특정 시간에 작업도 실행할 수 있습니다. 단점은 Redis 서버가 필요하다는 것입니다.