我如何在ruby中运行异步循环?

时间:2014-06-18 06:50:43

标签: ruby asynchronous

我需要执行一个运行多个管理系统命令的进程。我希望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

这是否有约定?

更新

我无法运行脚本的原因是root,是否有其他系统命令运行的脚本无法以root身份运行。每个命令都需要负责运行它自己的管理命令。该脚本可能需要相当长的时间才能运行,因此我只想在命令需要的时候保持sudo时间戳保持新鲜。

2 个答案:

答案 0 :(得分:1)

废弃所有这些并以root身份执行ruby脚本。

$ sudo ruby myscript.rb

答案 1 :(得分: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

正如David Unric所提到的,没有必要使用at_exit来终止线程,因为你的主进程会在完成时自动终止任何活动线程。