当您管道两个进程并在管道的"输出"处终止该进程时,第一个进程用于接收"Broken Pipe"信号,该信号通常也会终止它.比如跑步
$> do_something_intensive | less
Run Code Online (Sandbox Code Playgroud)
然后退出较少用于立即返回到SuSE8或以前版本的响应shell.当我今天尝试时,do_something_intensive显然仍在运行,直到我手动杀死它.似乎某些事情发生了变化(glib?shell?),这使得程序忽略了"破碎的管道"......
你们中的任何人都有这方面的暗示吗?如何恢复以前的行为?为什么它已被改变(或为什么它总是存在多个语义)?
编辑:进一步测试(使用strace的)揭示了"SIGPIPE" 被生成,但该程序不被中断.一个简单的
#include <stdio.h>
int main()
{
while(1) printf("dumb test\n");
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
将继续无止境
--- SIGPIPE (Broken pipe) @ 0 (0) ---
write(1, "dumb test\ndumb test\ndumb test\ndu"..., 1024) = -1 EPIPE (Broken pipe)
Run Code Online (Sandbox Code Playgroud)
当少被杀害.我可以肯定在我的程序中编写一个信号处理程序并确保它终止,但我更需要一些环境变量或shell选项来强制程序在SIGPIPE上终止
再次编辑:它似乎是一个特定于tcsh的问题(bash正确处理它)和终端依赖(Eterm 0.9.4)
我在eclipse RAP(Rich Ajax Platform 1.3.2)和Java 1.5版中使用jetty 6.1.23.我正在向浏览器发送PNG图像.这些是造成麻烦的代码:
服务器端:
response.setContentType(application.getMimeType(".png"));
response.setContentLength(outputSize);
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Max-Age", 0);
ServletOutputStream servletoutputstream = response.getOutputStream();
servletoutputstream.write(imageBytes); // this throws EofException
servletoutputstream.flush();
Run Code Online (Sandbox Code Playgroud)
客户端:
<img src="path to the servlet that is loading the image">
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这个问题不会一直发生.在我们搬到生产后,它会间歇性地发生.我们的测试环境没有问题.生产和我们的测试环境之间的唯一区别是,在生产环境中,用户远离我们的服务器,而在测试环境中,他们非常接近.
抛出异常时,客户端的浏览器端根本不会显示图像!到底是怎么回事?我该怎么做才能解决它或者至少有一个解决方法?
这是完整的异常跟踪(我强调了关键异常):
08 Feb 2012 11:49:08,955 ERROR [1584291438@qtp-2135195460-260] plugin.sda -
org.mortbay.jetty.EofException
at org.mortbay.jetty.HttpGenerator.flush(HttpGenerator.java:789)
at org.mortbay.jetty.AbstractGenerator$Output.flush(AbstractGenerator.java:568)
at org.mortbay.jetty.HttpConnection$Output.flush(HttpConnection.java:1006)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:650)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:590)
at com.scotiabank.ebss.common.viewer.util.ViewerUtil.sendBytes(ViewerUtil.java:533)
at com.scotiabank.ebss.common.viewer.servlets.ViewerServlet.doGet(ViewerServlet.java:242)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.eclipse.equinox.http.registry.internal.ServletManager$ServletWrapper.service(ServletManager.java:180)
at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61)
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:126)
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at …
Run Code Online (Sandbox Code Playgroud) 在我的日常工作中,我需要通过SSH保持连接以断开服务器,我通常会遇到两种不同的错误,第一种是“Broken Pipe”,第二种是“Connection reset by peer”。
我想知道这两组错误有什么区别?
我正在使用一些 EC2 实例来运行一些无法在本地运行的大型作业。我看到的问题是,一段时间后(进程启动后 X 小时),我的 shell 上的连接出现了管道损坏错误
ubuntu@ip-10-122-xxx-xxx:~/stratto/ode$ Write failed: Broken pipe
Run Code Online (Sandbox Code Playgroud)
该实例仍然存在,因为我可以毫无问题地重新连接,但如何重新连接并返回查看“损坏的管道”之前的进程日志
非常感谢任何提示,谢谢!
在python中运行代码,我发现了一个"Broken Pipe Error".可有人请向我解释这是什么简单?
谢谢.
我正在使用 userdocker 在远程服务器上一个接一个地训练几个 Keras 模型。我通过 ssh 连接到服务器,让它们在不同的屏幕上运行。
为了加快速度,我在 5 个 GPU 上训练模型,以便同时训练 5 个不同的模型。
大多数情况下,模型训练没有任何问题:我分离屏幕,从服务器注销并让它们运行一夜。然而,有时他们会在培训过程中因管道破裂消息而停止。下面我包含了消息的最后一部分,因为我认为它可能是最相关的,但它很长且重复。
我发现这个问题有一个稍微相似的错误消息,他们链接到这个解释,但我看不出如何在我的情况下修复它,或者我在我的代码中犯了可能导致这个问题的错误并不总是发生。
有没有人在使用 Keras 或 userdocker 时遇到过类似的问题?怎样才能防止它发生?
错误信息
23/24 [==========================>..] - ETA:7s - 损失:1.7797 - acc:0.2219 Traceback(大多数最近调用最后一次):
文件“/usr/local/lib/python2.7/dist-packages/keras/utils/data_utils.py”,第 655 行,在 _data_generator_task self.queue.put((True, generator_output))
文件中",第 2 行,放入
文件 "/usr/lib/python2.7/multiprocessing/managers.py",第 759 行,在 _callmethod 类型中,结果 = conn.recv() EOFError进程 Process-259:回溯(最近一次调用):
文件“/usr/lib/python2.7/multiprocessing/process.py”,第 258 行,在 _bootstrap self.run()
文件“/usr/lib/python2. 7/multiprocessing/process.py", line 114, in run self._target(*self._args, **self._kwargs)
File "/usr/local/lib/python2.7/dist-packages/keras/utils/ data_utils.py”,第 665 行,在 _data_generator_task self.queue.put((False, e))
文件“”,第 2 行,输入文件“/usr/lib/python2.7/multiprocessing/managers.py”,行758, in …
我正在编写一个程序,从两个单声道 ALSA 设备读取并将它们写入一个立体声 ALSA 设备。
我使用三个线程和乒乓缓冲区来管理它们。两个阅读线程和一个写作线程。它们的配置如下:
// Capture ALSA device
alsaBufferSize = 16384;
alsaCaptureChunkSize = 4096;
bitsPerSample = 16;
samplingFrequency = 24000;
numOfChannels = 1;
block = true;
accessType = SND_PCM_ACCESS_RW_INTERLEAVED;
// Playback device (only list params that are different from above)
alsaBufferSize = 16384 * 2;
numOfChannels = 2;
accessType = SND_PCM_ACCESS_RW_NON_INTERLEAVED;
Run Code Online (Sandbox Code Playgroud)
两个读取线程将写入 ping 缓冲区,然后写入 pong 缓冲区。写入线程将等待两个缓冲区中的任何一个准备好,锁定它,读取它,然后解锁它。
但是当我运行这个程序时,出现xrun并且无法恢复。
ALSA lib pcm.c:7316:(snd_pcm_recover) underrun occurred
ALSA lib pcm.c:7319:(snd_pcm_recover) cannot recovery from underrun, prepare failed: Broken pipe
Run Code Online (Sandbox Code Playgroud)
下面是我写入 ALSA 播放设备的代码:
bool CALSAWriter::writen(uint8_t** …
Run Code Online (Sandbox Code Playgroud) 我用烧瓶和小便.有时peewee会抛出这个错误
MySQL server has gone away (error(32, 'Broken pipe'))
Run Code Online (Sandbox Code Playgroud)
Peewee数据库连接
db = PooledMySQLDatabase(database,**{
"passwd": password, "user": user,
"max_connections":None,"stale_timeout":None,
"threadlocals" : True
})
@app.before_request
def before_request():
db.connect()
@app.teardown_request
def teardown_request(exception):
db.close()
Run Code Online (Sandbox Code Playgroud)
在mysql错误"MySQL服务器已经消失(错误(32,'Broken pipe'))"之后,选择查询工作没有问题,但插入,更新,删除查询不起作用.
在插入,更新,删除查询后面工作(在mysql中)但是peewee抛出这个错误.
(2006, "MySQL server has gone away (error(32, 'Broken pipe'))")
Run Code Online (Sandbox Code Playgroud) 我正在尝试从基于 GUI 的软件启动几个 bash 例程。我面临的问题是管道问题。这里是测试 bash 脚本(bashScriptTest.sh):
#!/bin/bash
#---------- Working
ls | sort | grep d > testFile.txt
cat testFile.txt
#---------- NOT working
echo $RANDOM > testFile2.txt
for i in `seq 1 15000`; do
echo $RANDOM >> testFile2.txt
done
awk '{print $1}' testFile2.txt | sort -g | head -1
Run Code Online (Sandbox Code Playgroud)
这里是创建错误的python脚本:
import subprocess
#
with open('log.txt','w') as outfile:
CLEAN=subprocess.Popen("./bashScriptTest.sh", stdout=outfile, stderr=outfile)
print CLEAN.pid
OUTSEE=subprocess.Popen(['x-terminal-emulator', '-e','tail -f '+outfile.name])
Run Code Online (Sandbox Code Playgroud)
从运行 python 脚本可以看出,Broken-pipe 错误不是在前三个管道(第一行)中遇到的,而是在 awk 完成大量工作之后遇到的。我需要在 bash 中管理大量的例程和子例程,并且使用 shell==True 标志不会改变任何事情。我试图以最 Pythonic 的方式编写所有内容,但不幸的是,我没有机会重写 …
我正在运行一些脚本,在几个地方,我正在运行用grep管道化的猫,如:
cat file.txt | grep "pattern"
Run Code Online (Sandbox Code Playgroud)
大多数时候都没有问题.但有时我会得到
cat:写错误:管道坏了
那么如何找出导致此问题的cat命令以及原因?
broken-pipe ×10
python ×4
bash ×2
linux ×2
networking ×2
shell ×2
alsa ×1
amazon-ec2 ×1
c++ ×1
cat ×1
docker ×1
flask ×1
gnu-screen ×1
grep ×1
java ×1
jetty ×1
keras ×1
mysql ×1
peewee ×1
ssh ×1
subprocess ×1
tcsh ×1