写入 STDOUT 时,Resque 作业失败并显示“Broken pipeline @ io_write - <STDOUT>”(Errno::EPIPE)

问题描述 投票:0回答:1

我们已经使用 Resque 运行后台作业好几年了,但最近开始出现失败的作业,并显示以下错误消息,我不确定我们的代码或环境发生了什么变化导致了这种情况。

Errno::EPIPE
Broken pipe @ io_write - <STDOUT>

每当作业调用 put(显然会写入 STDOUT)时,我们都会得到这个。

任何人都可以帮忙解释一下吗?

ruby-on-rails resque
1个回答
0
投票

您遇到的 Errno::EPIPE(管道损坏)错误通常表明该进程正在尝试写入另一端已关闭的流。当谈到后台作业和 STDOUT 时。

以下是一些查找这些工作失败原因的方法:

  1. 使用日志库确保您的日志得到正确管理并可以定向到不同的输出。

类似这样的:

require 'logger'

logger = Logger.new("/path/to/your/log/file.log")

# Replace puts with logger.info or other appropriate logger methods
logger.info("Your log message here")
  1. 检查您的 Resque 配置或作业运行环境最近是否有任何更改(例如,新的 Resque 版本、worker 启动方式的更改等)。

  2. 阻止作业失败的快速修复,您可以对工作线程进行猴子修补,以确保它不会尝试写入封闭的管道。

这是一个例子:

class ResqueWorker
  def puts(*args)
    begin
      super
    rescue Errno::EPIPE
      # Handle the error or redirect the output somewhere else
      File.open("/path/to/your/log/file.log", "a") { |f| f.puts(args) }
    end
  end

  def perform
    # Your job logic here
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.