2014-02-12 4 views
1

heroku worker에서 실행되는 rake 태스크에서 rufus-scheduler를 실행합니다. 정기적으로 heroku dynos를 다시 시작하기 때문에 SIGTERM 예외가 정기적으로 발생합니다 (heroku dyno docs 참조). 나는이 과정에서 위에서 언급 한 문서 및 종료 루퍼스 스케줄러에 표시된 정상 종료를 구현하고 싶습니다 :이 작업과 프로세스에 SIGTERM을 보내려고 할 때, 그러나heroku worker에서 rufus 스케줄러를 정상적으로 중지하십시오.

trap('TERM') do 
    scheduler.shutdown(:kill) 
    exit 
end 

내가 얻을 오류 :

can't be called from trap context 

SIGTERM에서 정상적으로 rufus 스케줄러를 종료하는 방법이 있습니까? ruby ​​2.0, rake 10.0.4, rufus-scheduler 3.0.2를 사용합니다.

P. 아니, heroku 스케줄러를 사용할 수 없습니다. 매분이 작업을 실행해야하기 때문에 ;-).

편집 (jmettraux)

테스트 코드 : https://gist.github.com/jmettraux/a4c00374f58e9f7affa8

루비 데비안 GNU/리눅스 금리 2.0.0-p247, 루퍼스 - 스케줄러 3.0.5 :

/home/jmettraux/w/rufus-scheduler/lib/rufus/scheduler/job_array.rb:74: 
    in `synchronize': can't be called from trap context (ThreadError) 
    from /home/jmettraux/w/rufus-scheduler/lib/rufus/scheduler/job_array.rb:74:in `to_a' 
    from /home/jmettraux/w/rufus-scheduler/lib/rufus/scheduler.rb:276:in `jobs' 
    from /home/jmettraux/w/rufus-scheduler/lib/rufus/scheduler.rb:127:in `shutdown' 
    from t.rb:8:in `block in <main>' 
    from t.rb:18:in `call' 
    from t.rb:18:in `sleep' 
    from t.rb:18:in `<main>' 

동일 플랫폼이지만 Ruby 1.9.3-p392를 사용하면 정상적으로 종료됩니다.

+0

가 전체 오류 메시지를 포함 해 주시기 바랍니다. 미리 감사드립니다. – jmettraux

+0

https://www.ruby-forum.com/topic/4411227 – jmettraux

+1

@jmettraux : 편집 해 주셔서 감사합니다! – mrzasa

답변

1

Thread 동기화가 발생했습니다. 나는 주위에 이런 식으로 작동합니다 :

p "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}" 
p $$ 
require 'rufus-scheduler' 

s = Rufus::Scheduler.new 

trap('TERM') do 
    $quit = true 
end 

s.every '10s' do 
    p :hello 
end 

s.every '1s' do 
    if $quit 
    p :bye 
    s.shutdown(:kill) 
    end 
end 

s.join 

shell1 :

$ ruby exit_scheduler.rb 
"2.0.0-p0" 
60580 

shell2 :

$ kill -s TERM 60580 

shell1 :

:bye