Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何让irb在长时间闲置后退出?_Ruby_Irb - Fatal编程技术网

Ruby 如何让irb在长时间闲置后退出?

Ruby 如何让irb在长时间闲置后退出?,ruby,irb,Ruby,Irb,我是一名DBA,我偶然发现了这样的情况:开发人员运行irb会话(来自RubyonRails应用程序)。此irb保持数据库连接打开。有时-他们忘记了它,它继续“运行”-不做任何事情,但仍然使用一个db连接 我想在他们的irb配置中添加一些“空闲超时”。可能吗?如何做到这一点?这里有一个快速的技巧,可以帮助您实现这一点 注意,这并没有考虑到用户可能正在irb会话中执行一些长时间运行的任务。它只是查看最后一次输入的时间戳;如果它没有改变,那么它就完全终止了进程: 更新:它现在检查irb当前是否正在运行

我是一名DBA,我偶然发现了这样的情况:开发人员运行irb会话(来自RubyonRails应用程序)。此irb保持数据库连接打开。有时-他们忘记了它,它继续“运行”-不做任何事情,但仍然使用一个db连接


我想在他们的irb配置中添加一些“空闲超时”。可能吗?如何做到这一点?

这里有一个快速的技巧,可以帮助您实现这一点

注意,这并没有考虑到用户可能正在irb会话中执行一些长时间运行的任务。它只是查看最后一次输入的时间戳;如果它没有改变,那么它就完全终止了进程:

更新:它现在检查irb当前是否正在运行命令,如果是,则忽略任何超时

# Add some methods to IRB::Context and IRB::Irb
# for easier timeout implementation.
class IRB::Irb
  def status
    @signal_status
  end
end

class IRB::Context
  attr_reader :irb
  attr_reader :line_no

  def is_evaluating?
    self.irb.status == :IN_EVAL
  end
end

# Implement an auto exit timer thread. Timeout is given in seconds.
module IRB
  def self.auto_exit_after(timeout = 60)
    Thread.new {
      context    = IRB.conf[:MAIN_CONTEXT]
      last_input = Time.now
      last_line  = context.line_no

      loop {
        sleep 10

        # Check if irb is running a command
        if context.is_evaluating?
          # Reset the input time and ignore any timeouts
          last_input = Time.now
          next
        end

        # Check for new input
        if last_line != context.line_no
          # Got new input
          last_line  = context.line_no
          last_input = Time.now
          next
        end

        # No new input, check if idle time exceeded
        if Time.now - last_input > timeout    
          $stderr.puts "\n** IRB exiting due to idle timeout. Goodbye..."
          Process.kill("KILL", Process.pid)
        end
      }
    }
  end
end
要使用它,请将代码添加到
.irbrc
,或在irb启动时自动加载的其他位置,然后只需启动计时器:

IRB.auto_exit_after(60)

在一段时间后终止进程可能更好,因为我认为irb没有自毁选项。或者可能在每天凌晨2点终止进程或其他什么?凌晨2点是个非常糟糕的主意,因为我们至少有4个不同时区的工作人员:)所有工作人员都在同一台机器上:)嗯,是的,那就不行:)你想在客户端强制执行此操作,并暂停他们的irb会话,即使他们没有连接到DB?超时空闲数据库连接不是更好吗?如果是Postgres,显然有类似PGBouncer的东西可以代理连接并管理空闲连接,你可以让开发者在开发环境中配置他们的连接设置,以通过这样的代理/连接管理器。我知道PGBouncer,问题是,我喜欢应用程序中的空闲db连接——我只是不喜欢开发人员提供的连接。即使他们由于运行迁移而使用应用程序凭据。这几乎可以正常工作,但这一点非常重要。如果我在irb中运行一些长时间运行的命令-足够长,超过超时时间-它也会被杀死。我知道用户可以修改截止日期,但如果我信任用户,我一开始就不会有这个问题。所以问题是-如果有命令运行,它可以被修改为不杀死irb吗?错过了您在开始时关于长时间运行命令的评论。好吧-听起来我想要的是不可能的吗?@user3095735当你掌握编程的力量时,没有什么是不可能的:)这里的问题是我们能让它变得多么美丽或可靠。这应该是可能的,但必须花更多的时间调查。如果我有空余时间,也许我可以看看。irb源代码就在Ruby中,只是研究它是如何在引擎盖下工作的,看看在哪里可以连接到它(或者找到其他方法来检测正在运行的任务)。是的,但是我自己不能(现实地)做,对不起,但我对Ruby几乎一无所知。对于Rails控制台,IRB上下文没有立即初始化。我添加了一个
sleep(5)
作为
线程的第一行。new
给它时间初始化。