Я демонизировал сценарий планировщика Ruby (используя Rufus) с Rufus-Scheduler DaemonKit, и я пытаюсь захватить сигналы TERM или INT, чтобы приложение попыталось сохранить состояние перед выходом.Rufus-Scheduler, DaemonKit и ловушки
DaemonKit имеет свой собственный метод trap_state (private), и он улавливает сигнал перед сценарием демона, поэтому, хотя у меня есть этот блок, он мало что делает.
DaemonKit::Application.running! do |config|
surprise = Surprise.new(interval, frequency, false)
surprise.start
config.trap('SIGINT') do #tried INT and TERM as well
puts 'Exiting'
surprise.stop
File.delete($lock)
end
end
В качестве побочного эффекта (возможно, ошибка в моей реализации?) После того, как SIGTERM в .rufus файл блокировки еще есть
Поведение на Ctrl-C сейчас это
[daemon-kit]: DaemonKit (0.3.1) booted, now running surprise
log writing failed. can't be called from trap context
[daemon-kit]: Running signal traps for INT
log writing failed. can't be called from trap context
[daemon-kit]: Running shutdown hooks
log writing failed. can't be called from trap context
[daemon-kit]: Shutting down surprise
Метод начала - довольно простой график.
def start
@scheduler = Rufus::Scheduler.new(:lockfile => $lock)
@scheduler.every '1d', :first_at => @first, :overlap => false do |job|
... # some work
end
@scheduler.join
end
def stop
# save state
@scheduler.shutdown
end
Извините, но в rufus-scheduler нет никакой ловушки 3.x (rufus-scheduler 2.x имел один, но ограничивался его специальной реализацией SignalScheduler). Вы уверены, что ваша строка 'File.delete ($ lock)' достигнута? Вы уверены, что это удастся, если оно будет достигнуто? Поместите 'puts 'Exited'' в конце вашей ловушки ... Волшебное фехтование. – jmettraux
@jmettraux ugh Я глуп, я перепутал DaemonKit и Rufus. Это DaemonKit trapping TERM, мой плохой – blackbird
Пожалуйста, обновите свои объяснения. Заранее спасибо! – jmettraux