2011-09-14 2 views
2

저는 매일 레일 서버에서 프로세스를 실행하기 위해 rufus-scheduler를 사용하고 있습니다. 테스트 목적으로 5 분마다라고 가정 해 봅시다. 내 코드는 다음과 같습니다 : 설정에서생산시 한 번만 실행되는 Rufus-scheduler

/초기화/task_scheduler.rb 나는 또한 크론 형식을 시도했습니다

scheduler = Rufus::Scheduler::PlainScheduler.start_new 
scheduler.every "10m", :first_in => '30s' do 
# Do stuff 
end 

: 실행 과정을 얻기 위해, 예를 들어

scheduler.cron '50 * * * *' do 
# stuff 
end 

을, 매시간 50 분 후.

분노한 부분은 내 로컬 컴퓨터에서 작동한다는 것입니다. 프로세스는 정기적으로 실행되며 작동합니다. 프로세스에 대해 한 번만 실행하고 반복하지 않는 것은 배포 된 앱에 대한 것입니다.

ps faux는 cron이 실행 중이며 승객이 레일스 프로세스의 스핀 업을 처리하고 사이트가 다시 핑 (ping)되어 새로 고쳐 져야한다는 것을 알게되며 생산에 코드의 변경 사항이 표시됩니다. 유일한 차이점은 경고 또는 오류없이 예약 된 작업이 반복되지 않는다는 것입니다.

도움말!

+0

당신의 아파치 구성 /etc/apache2/apach2.conf에 아래 라인을 추가하고 다시 시작 나는 또한 루퍼스 - 스케줄러 보석에 설치되어 있는지 확인했습니다 두 기계, 같은 버전. –

+0

시스템 cron이이 문제와 어떤 관련이 있는지 설명하십시오. – Kelvin

답변

2

rafus-scheduler는 레일즈 서버 자체에서 실행하지 않아야합니다. 특히 여객과 같은 다중 프로세스 프레임 워크에서는 실행하지 않는 것이 좋습니다. 대신 데몬 프로세스에서 실행해야합니다.

무슨 일이 일어나고 있는지에 대한 내 이론 :

승객 루비 서버 프로세스를 시작하고 요청을 처리하기 위해 다른 서버를 포크를 사용합니다. 그러나 rufus-scheduler는 주 스레드와는 별도의 스레드에서 작업을 실행하기 때문에 rufus 스레드는 원래 루비 프로세스에서만 작동합니다 (루비의 포크는 분기를 수행하는 스레드 만 복제합니다). 이것은 여러 스케줄러가 실행되는 것을 방지하기 때문에 좋은 일처럼 보일지 모르지만 승객은 특정 조건에서 루비 프로세스를 죽일 수 있습니다. 원본을 죽이면 스케줄러 스레드가 사라집니다.

3

아파치 서버

RailsAppSpawnerIdleTime 0 
PassengerMinInstances 1