2014-06-18 17 views
1

我需要執行一個運行多個管理系統命令的進程。我想保持sudo timestamp當前運行,以防過程運行時間過長。如何在ruby中運行異步循環?

我有以下代碼,但它似乎不工作。

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

原因我不能運行腳本有根,是有其他的系統命令的腳本運行不能作爲根運行。每個命令都需要負責運行它自己的管理命令。該腳本可能需要大量時間才能運行,所以我只是想在命令需要的時候保持sudo時間戳。

+0

爲什麼不用'sudo'運行你的ruby腳本? –

+0

這沒什麼意義。首先,你需要保持sudo的憑據更加系統化,而不是這種黑客攻擊。其次,你的線程會與主進程同時死掉,所以用Kernel.at_exit註冊是毫無意義的。 –

回答

1

爲了回答您的其他問題,有一個更好的方式來運行一個異步循環。

通過使用頭尾遞歸(def sudo; do_something; sudo; end),您可能會在10000次調用時遇到SystemStackError(請參閱How does your favorite language handle deep recursion?)。

相反,只需使用普通的老紅寶石循環。

Thread::new do 
    loop do 
    sleep 300 # 5.minutes is not base ruby, it comes from ActiveSupport 
    call_my_function 
    end 
end 

正如大衛UNRIC提到的,也沒有必要殺死使用at_exit線程,作爲你的主進程會自動殺死任何活動線程當它完成。

+0

這是一個更清潔的循環謝謝! – brewster

1

廢棄所有這些,並以root身份執行您的ruby腳本。

$ sudo ruby myscript.rb