我们已经使用 Resque 运行后台作业好几年了,但最近开始出现失败的作业,并显示以下错误消息,我不确定我们的代码或环境发生了什么变化导致了这种情况。
Errno::EPIPE
Broken pipe @ io_write - <STDOUT>
每当作业调用 put(显然会写入 STDOUT)时,我们都会得到这个。
任何人都可以帮忙解释一下吗?
您遇到的 Errno::EPIPE(管道损坏)错误通常表明该进程正在尝试写入另一端已关闭的流。当谈到后台作业和 STDOUT 时。
以下是一些查找这些工作失败原因的方法:
类似这样的:
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")
检查您的 Resque 配置或作业运行环境最近是否有任何更改(例如,新的 Resque 版本、worker 启动方式的更改等)。
阻止作业失败的快速修复,您可以对工作线程进行猴子修补,以确保它不会尝试写入封闭的管道。
这是一个例子:
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