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