我需要执行一个运行多个管理系统命令的进程。我希望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时间戳保持新鲜。
答案 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
来终止线程,因为你的主进程会在完成时自动终止任何活动线程。