ruby - 如何使 Ruby 脚本每秒运行一次?

标签 ruby

我有一个需要大约每秒运行一次的 Ruby 脚本。我正在使用 Ruby 脚本来跟踪目录中文件的修改,并希望脚本在“实时”时间跟踪更新。

基本上,我希望我的脚本执行与在 Unix shell 上运行“top”相同的操作,其中屏幕大约每秒更新一次。 Ruby 中是否有与 JavaScript 中的 setInterval 等效的东西?

最佳答案

有几种方法可以做到这一点。

快速而简单的版本:

  1. 外壳(科尔语):

    while :; do
       my_ruby_script.rb
       sleep 1
    done
    
  2. 观看(1):

    shell$ watch -n 1 my_ruby_script.rb
    

    这将每秒运行一次脚本,并在终端中显示最近一次运行的输出。

  3. 在 ruby 中:

    while true
       do_my_stuff
       sleep 1
    end
    

这些都遇到了同样的问题:如果实际的脚本/函数需要时间来运行,它会使循环运行的时间少于每秒。

这是一个 ruby​​ 函数,它会确保(几乎)准确地每秒调用一次该函数,只要该函数不超过一秒:

def secondly_loop
    last = Time.now
    while true
        yield
        now = Time.now
        _next = [last + 1,now].max
        sleep (_next-now)
        last = _next
    end
end

像这样使用它:

secondly_loop { my_function }

关于ruby - 如何使 Ruby 脚本每秒运行一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13791964/

相关文章:

ruby - attr_encrypted gem 无法在 Rails 6 中工作

ruby-on-rails - 如何随机化 `ActiveRecord::Relation` 的数组元素位置?

c# - 成员(member)验证与接口(interface)

ruby-on-rails - 尝试启动 Rails 服务器时出错

sql - 无法引用数组 - rails sql

ruby-on-rails - Ruby on Rails 中的 send_data 和 send_file 有什么区别?

ruby - 在不初始化对象的情况下存储变量? ruby gem 'Mail'

ruby - "wrong number of arguments (1 for 0)"在 Ruby 中是什么意思?

ruby - 使用 Apache 托管 Ruby gem

ruby-on-rails - SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 读取服务器 hello A - Faraday::Error::ConnectionFailed