You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中不使用sleep如何等待变量就绪?Slack机器人SSH请求问题

问题解答

完全可以不借助sleep实现这类等待,你当前场景甚至不需要额外写等待逻辑——你用的Net::SSH#exec!本身就是同步阻塞方法,会一直等到SSH命令执行完成、拿到完整输出后才会返回值,不会出现result未就绪就执行后续逻辑的情况。

你现有代码的核心问题不是缺少等待逻辑,而是sshPingRequest的调用位置写错了:

  • 你现在把data = sshPingRequest()写在Slack事件配置块的最外层,这行代码会在Bot服务启动时仅执行一次,后续所有用户触发/ans-ping命令时,返回的都是服务启动时拉取的旧数据,不是实时执行ansible ping的结果。

修正方案

直接把SSH请求调用移到/ans-ping命令的事件回调内部即可,回调块内的代码是顺序阻塞执行的,SSH请求未拿到完整结果前,不会执行后续返回响应的逻辑。修正后的代码如下:

def sshPingRequest()
    Net::SSH.start('xxxx.xxxxx.xxxxx', 'root', :port => "3132") do |ssh|
        output = ssh.exec!("ansible -m ping c3")
        result = output.split("\n").select { |line| line.include?("SUCCESS") || line.include?("FAILURE") }
        puts "############## Done #############"
        result
    end
end

SlackRubyBotServer::Events.configure do |config|
    config.on :command, '/ans-ping' do |command|
        command.logger.info 'Received a ping, responding with pong.'
        data = sshPingRequest()
        # 数组转成字符串,适配Slack消息格式
        { text: data.join("\n") }
    end 
end

补充说明

  • 常规的Ruby同步方法调用天然是顺序执行的,上一行代码没执行完、返回值没就绪,下一行代码根本不会运行,这类场景完全不需要sleep做等待。
  • 如果后续遇到异步场景(比如后台线程执行任务、非阻塞IO拿结果)需要等待变量就绪,也不建议用sleep轮询,用Ruby标准库的Thread#join、Queue即可实现精准等待,不会出现等待时长不准的问题。

内容的提问来源于stack exchange,提问作者user19144229

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:15:28