2014-02-12 2 views
1

Я запускаю rufus-scheduler в задаче грабли, которая работает на работника герою. Я регулярно получаю исключение SIGTERM из-за регулярного перезапуска dynkus (см. heroku dyno docs). Я хотел бы реализовать корректное завершение работы, показанной в указанных выше Документах и ​​выключение Руфус планировщика во время этого процесса:Изящно останавливать планировщик rufus на рабочем столе героя

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

Однако, когда я пытаюсь отправить SIGTERM процессу с этой задачей, я получаю сообщение об ошибке:

can't be called from trap context 

Есть ли способ изящно закрыть планировщик rufus на SIGTERM? Я использую ruby ​​2.0, rake 10.0.4, rufus-scheduler 3.0.2.

P.S. Нет, я не могу использовать планировщик героку, потому что мне нужно каждую минуту запускать эту задачу ;-).

EDIT (jmettraux)

тестовый код: https://gist.github.com/jmettraux/a4c00374f58e9f7affa8

рубин 2.0.0-P247, Руфус-планировщик 3.0.5 на урожайность Debian GNU/Linux:

/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>' 

Same платформу, но с Ruby 1.9.3-p392, и она изящно закрывается.

+0

Пожалуйста, включают полное сообщение об ошибке. Заранее спасибо. – jmettraux

+0

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

+1

@jmettraux: спасибо за редактирование! – mrzasa

ответ

1

ОК, это рубин 2,0 специфические (https://www.ruby-forum.com/topic/4411227)

Следующая версия Руфуса-планировщик будет включать обходной путь.

https://github.com/jmettraux/rufus-scheduler/issues/98

Спасибо за сообщение о проблеме.

+1

rufus-scheduler 3.0.6 выпущен. Он включает исправление. https://rubygems.org/gems/rufus-scheduler – jmettraux

1

Вопрос, который у вас возник, связан с Thread синхронизацией в trap. Я хотел бы работать вокруг него таким образом:

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 

оболочку1:

$ ruby exit_scheduler.rb 
"2.0.0-p0" 
60580 

shell2:

$ kill -s TERM 60580 

оболочку1:

:bye