免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10212 | 回复: 14
打印 上一主题 下一主题

重定向到文件后,标准输出丢失,怎么办? [复制链接]

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-07 16:50 |只看该作者 |倒序浏览
10可用积分
本帖最后由 yjh777 于 2010-11-19 23:19 编辑

./prog 是一个服务进程,启动阶段会打印一些初始化提示信息到标准输出
./prog >logfile &  执行后,logfile里并没有那些提示信息;

现在怀疑重定向到文件后,io变成了全缓冲 导致的;
可是怎么解决这个问题呢?可不可以通过shell方法把这些标准输出信息重定向到logfile啊?(别组做的,没有源码)

写了测试程序,在C里面打到stderr,然后 ./test 2>logfile & 是可以的
可是试了如下方法却不好用:
./prog 2>logfile 1>&2  &
发现原因如下: <<(2010-05-26)
                              |
           USER SPACE         |    KERNEL SPACE
                              |
        +--------------+      |                                           +-----------------+
        | FILE *stdout |      |   +------------+               close----->| fileobj1 urtty  |
        +--------------+      |   |fd 0        +                          +-----------------+
                     `--------#-->|fd 1        +-----#                    +-----------------+
                     /--------#-->|fd 2        +------\-#      close----->| fileobj2 urtty  |
        +--------------+      |   .            .       \ \                +-----------------+
        | FILE *stderr |      |   .            .        \ \    +------------------+
        +--------------+      |   |fd x        +---------#-#-->| fileobjx newfile |
                              |                                +------------------+
                              |
                              |

(2010-05-26)

各位大侠帮看看,这个问题怎么解决,
shell里可以修改标准输出的缓存策略吗?

最佳答案

查看完整内容

unbuffer ./prog >logfile &

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2009-07-07 16:50 |只看该作者
unbuffer ./prog >logfile &


  1. [waker@proxy ~]$ cat $(which unbuffer)
  2. #!/bin/sh
  3. # \
  4. exec expect -- "$0" ${1+"$@"}
  5. # Description: unbuffer stdout of a program
  6. # Author: Don Libes, NIST

  7. if {[string compare [lindex $argv 0] "-p"] == 0} {
  8.     # pipeline
  9.     set stty_init "-echo"
  10.     eval spawn -noecho [lrange $argv 1 end]
  11.     interact
  12. } else {
  13.     set stty_init "-opost"
  14.     eval spawn -noecho $argv
  15.     set timeout -1
  16.     expect
  17. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2009-07-07 17:08 |只看该作者

回复 #1 yjh777 的帖子

写了测试程序,在C里面打到stderr,然后 ./test 2>logfile & 是可以的

stderr一般是不带缓冲的,这个应该可以。不知道你的这个prog是怎么实现的,会不会重刷logfile,建议楼主先把 > 改成 >> 试试吧

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
4 [报告]
发表于 2009-07-07 17:14 |只看该作者
原帖由 deepalley 于 2009-7-7 17:08 发表

stderr一般是不带缓冲的,这个应该可以。不知道你的这个prog是怎么实现的,会不会重刷logfile,建议楼主先把 > 改成 >> 试试吧


谢谢回复

问题主要是: (见红色字体)
可是怎么解决这个问题呢?可不可以通过shell方法把这些标准输出信息重定向到logfile啊?(别组做的,没有源码)




想不通为什么 2>logfile 1>&2 不起作用,,

[ 本帖最后由 yjh777 于 2009-7-7 17:16 编辑 ]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
5 [报告]
发表于 2009-07-07 17:32 |只看该作者
2>logfile 1>&2 不起作用?你说是"一些初始化提示信息到标准输出"?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
6 [报告]
发表于 2009-07-07 17:47 |只看该作者

回复 #5 waker 的帖子

学习!

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
7 [报告]
发表于 2009-07-07 17:50 |只看该作者
原帖由 waker 于 2009-7-7 17:35 发表
unbuffer ./prog >logfile &


[waker@proxy ~]$ cat $(which unbuffer)
#!/bin/sh
# \
exec expect -- "$0" ${1+"$@"}
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST

if ...


太神奇了,,

没看懂,第二行
  1. # \
复制代码

是什么意思啊,为什么去掉就报错啊?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
8 [报告]
发表于 2009-07-07 17:53 |只看该作者

回复 #7 yjh777 的帖子

最近本版曾讨论过,自己翻翻吧。

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
9 [报告]
发表于 2009-07-07 17:55 |只看该作者
原帖由 blackold 于 2009-7-7 17:32 发表
2>logfile 1>&2 不起作用?你说是"一些初始化提示信息到标准输出"?

是啊,我以为将标准输出先重定向到标准错误,就不会缓冲了;
但是不行,回去google查查重定向的实现去,,

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
10 [报告]
发表于 2009-07-07 17:57 |只看该作者
原帖由 blackold 于 2009-7-7 17:53 发表
最近本版曾讨论过,自己翻翻吧。


不是吧,能不能给个关键字啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP