[英]how do i run an asynchronous loop in ruby?
我需要執行一個運行幾個管理系統命令的過程。 我想在運行時將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
我無法運行腳本的原因是具有root用戶權限,是否還有其他系統命令無法以root用戶身份運行腳本。 每個命令都需要負責運行自己的管理命令。 該腳本可能會花費大量時間來運行,因此我只是想在命令需要時保持sudo時間戳最新。
廢棄所有這些,然后以root身份執行ruby腳本。
$ sudo ruby myscript.rb
為了回答您的另一個問題,有一種更好的方法來運行異步循環。
通過使用頭尾遞歸( def sudo; do_something; sudo; end
),您冒着在大約10000次調用時遇到SystemStackError的風險(請參閱您喜歡的語言如何處理深度遞歸? )。
相反,只需使用常規的舊紅寶石循環即可。
Thread::new do
loop do
sleep 300 # 5.minutes is not base ruby, it comes from ActiveSupport
call_my_function
end
end
正如David Unric提到的那樣,無需使用at_exit
殺死線程,因為您的主進程將在完成時自動殺死任何活動線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.