2014-10-09 6 views
1

Rufus-Scheduler DaemonKit으로 Ruby 스케줄러 스크립트를 daemonized했습니다. 응용 프로그램이 상태를 저장하기 전에 TERM 또는 INT 신호를 트랩하려고합니다.Rufus-Scheduler, DaemonKit 및 트랩

DaemonKit에는 자체 trap_state (개인) 메소드가 있으며 데몬 스크립트 앞에 신호가 걸려 있으므로이 블록이 있더라도 많은 일을하지 않습니다. (어쩌면 내 구현 실수?) SIGTERM .rufus의 잠금 파일 후 여전히

의 행동이 부작용으로

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 

는 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 
+0

죄송 합니다만 rufus-scheduler 3.x에는 트랩이 없습니다 (rufus-scheduler 2.x는 하나이지만 특별한 SignalScheduler 구현으로 제한됨). 'File.delete ($ lock)'줄에 도달 했습니까? 도달하면 성공할 수 있습니까? 함정의 끝 부분에'Exited''를 놓으십시오. 울프 펜싱. – jmettraux

+1

@jmettraux 우 바보입니다. DaemonKit과 Rufus가 섞였습니다. DaemonKit이 TERM을 함정에 넣고 있습니다. 내 잘못은 – blackbird

+0

입니다. 그런 다음 설명을 업데이트하십시오. 미리 감사드립니다! – jmettraux

답변

1

이렇게 간단합니다. e trap proc (또는 제 경우에는 블록) start 메소드에서 스케줄러를 실행하기 전에. 지금은별로 영리하지 못하지만 다음 코드는 예상대로 작동합니다. 참고로 set_trap은 DK에서 private이지만 public trap 메서드는 DK 시작과 함께 제공되는 기본값보다 우선합니다.

DaemonKit::Application.running! do |config| 

    surprise = Surprise.new(interval, frequency, false) 

    config.trap("TERM") { surprise.stop } 
    config.trap("INT") { surprise.stop } 

    surprise.start 
end 

흥미롭게 나는

+0

'Surprise # start'에서 실행중인 코드를 차단하고 다음 트랩이 설정되지 않은'Scheduler # join'을 호출합니다. 이것이이 버전에서 작동하는 이유입니다. –

2

불구하고 자신의 대답을 보면 내가

[daemon-kit]: Trapping SIGINT signals not supported on this platform 

INT와 TERM 모두 작업 전에 발견하지 않았다면 시작시이 줄을보고, 다음 코드는 사용자가 붙여 넣기 :

def start 
    @scheduler = Rufus::Scheduler.new(:lockfile => $lock) 
    # ... 
    @scheduler.join # <- NOT NEEDED 
end 

DaemonKit의 DaemonKit::Application.running! 블록이 실제로 실행을 끝내지 않습니다. g이므로 모든 스레드에서 #join을 호출하는 것을 건너 뛸 수 있습니다.

우리는이 유스 케이스가 더 널리 사용되는 것을보고 싶기 때문에이 유스 케이스를 더 명확하게 만들기 위해 노력해야합니다.

+0

감사! 내가 DK 전에 Rufus를 단독으로 사용했을 때 남은 것일 수 있습니다. 하지만 언제 스레드에 참여해야합니까? – blackbird

+0

바닐라 루비 프로젝트에서 그렇게해야합니다. DaemonKit은 스크립트를 유지할 필요성을 추상화합니다. 그것은 갈고리 또는 사기꾼에 의해, 당신의 프로세스를 살아 있고 실행 유지합니다. –