簡體   English   中英

如何在ruby中運行異步循環?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM