天下·网吧联盟
登录 申请网盟通行证 忘记密码 逛逛论坛
当前位置:首页 >> 技术纵横 >> 解决方案 >> 解决Linux系统下管道被接受方关闭的问题
解决Linux系统下管道被接受方关闭的问题
作者:korn  2008年04月24日  来源:塞迪网
收藏本文  打印此页  举报本文  评论  投稿

Linux shell中的管道|是非常方便的功能,可以将一个程序的输出作为另外一个程序的输入,这样我们可以将多个命令“拼”在一起,省去了临时文件的繁琐。windows中也有类似的用法,比如dir |more,学过dos命令的应该都知道吧。

既然是管道,那么就有一个入口和一个出口,各自对应一个应用程序,正常的情况下,入口应用程序的输出应当被出口应用程序全部接受,但在一些特殊情况,出口应用程序会提前关闭管道,比如在查询svn的更新日志,只取前己行的时候:

$ svn log |head

----------------

r137 | Fwolf | 2007-05-28 13:38:47 +0800 (Mon, 28 May 2007) | 4 lines

更新记录。

svn: Write error: Broken pipe

由于head只需要用到输入的前10行(默认行数,也可由用户指定),再接收剩下的输出也是多余,便提前关闭了管道,管道入口的应用程序svn发现之后,便报错退出了。在这个例子中,错误信息非常清楚,但不是所有应用程序都这样的,比如下面这个:

$ find . -name "*rc" |xargs -i cat {}|head -1

[Desktop]

xargs: cat: terminated by signal 13

错误信息似乎并不太好理解,实际上它的意思是:xargs发现它的子进程cat由于信号13被中止了。由于xargs本身属于循环操作,发现错误之后就停止了循环,这是其一;信号13是在cat试图向一个已关闭的pipe管道中写数据的时候,系统产生的,cat收到之后就停止了。类似于在cat输出的过程中,用户按下ctrl+c的效果。

如何避免这种问题呢?很简单,管道后面使用不会提前关闭管道的程序即可,尤其是结合xargs使用的时候,它发现出错就不继续了。比如要用到head可以这样:

$ cat file |head -1

虽然cat仍然会被signal 13关闭,但bash是不会报错的,所以也只能针对一个文件进行操作,即使是使用了通配符也只能head到第一个文件。如果要加上对文件的遍历,可以用到for:

$for file in .*rc;do cat $file |head -1;done

cat依然会被关闭,但是for不会理会它,继续循环。head也可以直接指定文件名,这样我们就可以抛开cat了:

$find . -name "*rc" |xargs -i head -n1 {}

个人认为这是一种最完美的解决方式,即可以用到find强大的搜索指令,还不会涉及到管道的问题。不过如果文件名没有什么特殊要求,还有一种更简单的方式:

$head -n1 .*rc

在head的参数中直接用通配符指定文件。

 

声明:本站所发表的文章与图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系邮箱:editor@untx.com。

网盟藏经阁

平安奥运 安全网吧 平安奥运 安全网吧
  2008 年北京奥运会的脚步愈来愈近,在这场充满无限商机的全球性体育盛会和商业盛宴面前,网吧作为....[详情]
揭秘中型网吧如何应对网吧市场发展趋势 揭秘中型网吧如何应对网吧市场发展..
一、前言  现今,网吧行业正呈现网络规模扩大化的发展趋势,然而,并不是所有的网吧都可做到,那么如....[详情]
百年奥运 安全先行 百年奥运 安全先行
  作为世界三大竞技比赛的体育项目之一(奥运会、世界杯、F1)─奥运会无疑会成为世界的焦点,今夏即....[详情]
无盘网吧利好多多 无盘网吧利好多多
  中国人的无盘工作系统,大约在1997年走向社会,走进网吧。历经10多年的磨砺,无盘工作系统逐渐得到....[详情]
教你做网吧广告——百万格子网吧版 教你做网吧广告——百万格子网吧版
在网吧做广告已非新鲜事,但如何充分发挥网吧优势,“压榨”出更多的广告,想必大家也在绞尽脑汁了[详情]

百度主题推广

网站地图 | 关于天下 | 商务合作 | 广告投放 | 投稿指南 | 联系方式 | 友情链接 | 版权声明 | 免责条款 | 隐私保护
新 宽 联 数 码] 中国网吧增值业务领头羊
新宽联数码 2000 - 2008 建设 - 维护 - 版权所有 粤B2-20040365号
广州网监-报警岗亭