레일을위한 크론 작업 : 모범 사례?
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 환경 시작 비용을 피하려는 경우)에서 선호하는 방법은 시스템 cron을 사용하여 (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
자세한 내용은 다음을 참조하십시오 : https://github.com/jmettraux/rufus-scheduler
작업을 완료하는 데 시간이 오래 걸리지 않는다고 가정하면 각 작업에 대한 작업으로 새 컨트롤러를 만드십시오. 태스크의 논리를 컨트롤러 코드로 구현 한 다음 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 서버가 필요하다는 것입니다.
아무도 Sidetiq을 언급하지 않은 것이 흥미 롭습니다 . Sidekiq을 이미 사용하고 있다면 좋은 추가 기능입니다.
Sidetiq은 Sidekiq의 반복 작업자를 정의하기위한 간단한 API를 제공합니다.
직업은 다음과 같습니다.
class MyWorker
include Sidekiq::Worker
include Sidetiq::Schedulable
recurrence { hourly.minute_of_hour(15, 45) }
def perform
# do stuff ...
end
end
둘 다 잘 작동합니다. 나는 보통 스크립트 / 러너를 사용합니다.
예를 들면 다음과 같습니다.
0 6 * * * cd /var/www/apps/your_app/current; ./script/runner --environment production 'EmailSubscription.send_email_subscriptions' >> /var/www/apps/your_app/shared/log/send_email_subscriptions.log 2>&1
데이터베이스에 연결하기 위해 올바른 구성 파일을로드하는 경우 순수 Ruby 스크립트를 작성할 수도 있습니다.
메모리가 소중한 경우 명심해야 할 것은 스크립트 / 런너 (또는 '환경'에 의존하는 레이크 작업)가 전체 Rails 환경을로드한다는 것입니다. 데이터베이스에 일부 레코드 만 삽입하면 실제로 필요하지 않은 메모리가 사용됩니다. 자신의 스크립트를 작성하면이를 피할 수 있습니다. 실제로이 작업을 수행 할 필요는 없었지만 고려하고 있습니다.
크랙 사용 (레이크 중심 크론 작업)
나는 backgroundrb를 사용합니다.
http://backgroundrb.rubyforge.org/
예약 된 작업과 일반적인 클라이언트 / 서버 관계에 비해 너무 오래 걸리는 작업을 실행하는 데 사용합니다.
cron 작업을 설정하는 방법은 다음과 같습니다. 하나는 SQL 데이터베이스를 매일 백업하고 (레이크를 사용하여) 한 달에 한 번 캐시를 만료시키는 백업이 있습니다. 모든 출력은 파일 log / cron_log에 기록됩니다. 내 crontab은 다음과 같습니다.
crontab -l # command to print all cron tasks
crontab -e # command to edit/add cron tasks
# Contents of crontab
0 1 * * * cd /home/lenart/izziv. whiskas.si/current; /bin/sh cron_tasks >> log/cron_log 2>&1
0 0 1 * * cd /home/lenart/izziv.whiskas.si/current; /usr/bin/env /usr/local/bin/ruby script/runner -e production lib/monthly_cron.rb >> log/cron_log 2>&1
첫 번째 cron 태스크는 매일 DB 백업을 수행합니다. cron_tasks의 내용은 다음과 같습니다.
/usr/local/bin/rake db:backup RAILS_ENV=production; date; echo "END OF OUTPUT ----";
두 번째 작업은 나중에 설정되었으며 스크립트 / 런너를 사용하여 한 달에 한 번 캐시를 만료합니다 (lib / monthly_cron.rb).
#!/usr/local/bin/ruby
# Expire challenge cache
Challenge.force_expire_cache
puts "Expired cache for Challenges (Challenge.force_expire_cache) #{Time.now}"
나는 다른 방법으로 데이터베이스를 백업 할 수 있다고 생각하지만 지금까지 그것은 나를 위해 작동 :)
갈퀴와 루비 의 경로 는 서버마다 다를 수 있습니다. 다음을 사용하여 위치를 확인할 수 있습니다.
whereis ruby # -> ruby: /usr/local/bin/ruby
whereis rake # -> rake: /usr/local/bin/rake
Sidekiq 또는 Resque를 사용하는 것이 훨씬 강력한 솔루션입니다. 두 가지 모두 작업 재시도, REDIS 잠금을 통한 독점 성, 모니터링 및 스케줄링을 지원합니다.
Resque는 죽은 프로젝트 (활동적으로 유지되지 않음)이므로 Sidekiq가 더 나은 대안입니다. 또한 Sidekiq는 단일 멀티 스레드 프로세스에서 여러 작업자를 실행하고 Resque는 각 작업자를 별도의 프로세스로 실행합니다.
최근에 내가 작업 한 프로젝트에 대한 일부 크론 작업을 만들었습니다.
보석 시계가 매우 유용 하다는 것을 알았습니다 .
require 'clockwork'
module Clockwork
every(10.seconds, 'frequent.job')
end
이 보석을 사용하여 백그라운드 작업을 예약 할 수도 있습니다. 설명서 및 추가 도움말은 https://github.com/Rykian/clockwork 를 참조 하십시오.
일단 같은 결정을 내렸고 오늘 그 결정에 정말 만족합니다. 별도의 redis가 db에서로드를 가져갈뿐만 아니라 훌륭한 사용자 인터페이스를 제공하는 resque-web과 같은 많은 플러그인에 액세스 할 수 있기 때문에 resque scheduler를 사용하십시오 . 시스템이 개발됨에 따라 점점 더 많은 작업을 예약 할 수 있으므로 한 곳에서 제어 할 수 있습니다.
cron을 만드는 데 사용 resque
하고 resque-schedular
gem을 사용할 수 있습니다 .이 작업은 매우 쉽습니다.
https://github.com/resque/resque
https://github.com/resque/resque-scheduler
아마도 최선의 방법은 레이크를 사용하여 필요한 작업을 작성하고 명령 줄을 통해 실행하는 것입니다.
railscasts에서 매우 유용한 비디오를 볼 수 있습니다
이 다른 자료도 살펴보십시오.
나는 시계 보석을 사용 했고 그것은 나를 위해 아주 잘 작동합니다. 또한이 clockworkd
스크립트는 데몬으로 실행할 수 있습니다 보석.
정말 있는지, 나는 그것이 작업에 따라 생각하고 있지 않다 : 실행하는 방법을 자주, 많이 복잡 얼마나 직접 통신 방법은 프로젝트가 바로이 있다면 등 같아요 필요한 레일과 함께 "한 최선의 방법" 뭔가를 할 수 그렇게하는 방법은 그리 많지 않을 것입니다.
Rails 프로젝트의 마지막 작업에서 서버가있을 때마다 계획된 메일을 보내야하는 일괄 초대 메일러 (스팸 메일이 아닌 설문 초대)를 만들어야했습니다. 디먼 도구 를 사용 하여 내가 만든 레이크 작업을 실행 하려고했다고 생각 합니다.
불행히도, 우리 회사는 돈 문제가 있었고 주요 라이벌이 "매입"하여 프로젝트가 완료되지 않았으므로 결국 우리가 무엇을 사용했는지 알지 못합니다.
스크립트를 사용하여 cron을 실행하십시오. 이것이 cron을 실행하는 가장 좋은 방법입니다. 다음은 cron의 예입니다.
CronTab 열기-> sudo crontab -e
그리고 벨로우 라인 붙여 넣기 :
00 00 * * * wget https : // your_host / some_API_end_point
여기에 cron 형식이 있습니다.
::CRON FORMAT::
Examples Of crontab Entries
15 6 2 1 * /home/melissa/backup.sh
Run the shell script /home/melissa/backup.sh on January 2 at 6:15 A.M.
15 06 02 Jan * /home/melissa/backup.sh
Same as the above entry. Zeroes can be added at the beginning of a number for legibility, without changing their value.
0 9-18 * * * /home/carl/hourly-archive.sh
Run /home/carl/hourly-archive.sh every hour, on the hour, from 9 A.M. through 6 P.M., every day.
0 9,18 * * Mon /home/wendy/script.sh
Run /home/wendy/script.sh every Monday, at 9 A.M. and 6 P.M.
30 22 * * Mon,Tue,Wed,Thu,Fri /usr/local/bin/backup
Run /usr/local/bin/backup at 10:30 P.M., every weekday.
희망이 당신을 도울 것입니다 :)
참고 URL : https://stackoverflow.com/questions/285717/a-cron-job-for-rails-best-practices
'development' 카테고리의 다른 글
jQuery가 요소와 관련된 모든 CSS 스타일을 가져올 수 있습니까? (0) | 2020.03.17 |
---|---|
CSS3의 border-radius 속성과 border-collapse : collapse는 혼합되지 않습니다. (0) | 2020.03.17 |
Internet Explorer 브라우저 용 JavaScript에서 Array indexOf ()를 수정하는 방법 (0) | 2020.03.17 |
SQL Server에서 숫자, 부동 및 소수의 차이점 (0) | 2020.03.17 |
자바 스크립트 : location.href와 위치 설정 (0) | 2020.03.17 |