2014-06-18 3 views
1

몇 가지 관리 시스템 명령을 실행하는 프로세스를 실행해야합니다. 프로세스가 너무 오래 실행되는 경우에 실행되는 동안 sudo 타임 스탬프를 현재 상태로 유지하려고합니다.어떻게 루비에서 비동기 루프를 실행합니까?

다음 코드가 있지만 제대로 작동하지 않는 것 같습니다.

sudo_keep_alive = Thread.start do 
    def sudo 
    sleep 5.minutes 
    `sudo -v` 
    sudo 
    end 
    sudo 
end 

at_exit do 
    sudo_keep_alive.kill 
end 

규칙이 있습니까?

UPDATE

의 I 스크립트를 실행할 수 없습니다 이유 루트를 가지고는, 다른 시스템이 스크립트가 루트로 실행할 수 없습니다 실행 명령입니다이다. 각 명령은 자신의 관리 명령을 실행해야합니다. 스크립트는 잠재적으로 실행하는 데 상당한 시간이 걸릴 수 있으므로 명령에서 필요로하는 이벤트에서 새로운 sudo 타임 스탬프를 유지하기 만하면됩니다.

+0

왜'sudo'로 루비 스크립트를 실행하지 않습니까? –

+0

별로 의미가 없습니다. 우선 당신은 그러한 해킹이 아닌,보다 체계적인 방법으로 sudo 자격 정보를 유지해야 할 것입니다. 둘째, 스레드는 주 프로세스와 동시에 죽을 것이므로 Kernel.at_exit을 사용하여 등록하는 것은 의미가 없습니다. –

답변

1

다른 질문에 대답하려면 비동기 루프를 실행하는 것이 좋습니다.

head-tail 재귀 (def sudo; do_something; sudo; end)를 사용하면 약 10000 건의 호출에서 SystemStackError가 발생할 위험이 있습니다 (How does your favorite language handle deep recursion? 참조).

대신 기존의 루비 루프를 사용하십시오.

데이비드 Unric에서 언급 한 바와 같이
Thread::new do 
    loop do 
    sleep 300 # 5.minutes is not base ruby, it comes from ActiveSupport 
    call_my_function 
    end 
end 

,이 완료되면 메인 프로세스가 자동으로 활성 스레드를 죽일 것 같은 at_exit를 사용하여 스레드를 죽일 필요가 없다.

+0

이것은 훨씬 더 깨끗한 루프 감사입니다! – brewster

1

이 모든 것을 스크랩하고 루트로 루비 스크립트를 실행하십시오.

$ sudo ruby myscript.rb 
관련 문제