免费注册 查看新帖 |

Chinaunix

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

Shell脚本的标准输出重定向到文件里,稍后突然不写入了? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-30 10:01 |只看该作者 |倒序浏览
最近遇到几个奇怪的标准输出异常中止,不再写的情况,所以想给他搞明白。

有以下3中情形发生过标准输出突然就不写入的。
情形1. nohup ./startWebLogic.sh  > nohup_${Server_Name}.out  2>&1 &
情形2. nohup ./startWebLogic.sh | cronolog  nohup_%Y%m%d.log 2>&1 &
情形3. nohup /usr/java5/bin/java -Xms1024m -Xmx2048m -Dfile.encoding=gb2312 -jar BATCH.jar | cronolog nohup_batch_${DATE}.log &

情形1在Linux、AIX上都有发生过,情形[2-3]都发生在AIX上,有遇到过的朋友吗?或者有什么分析这个问题的思路?

谢谢了!

论坛徽章:
0
2 [报告]
发表于 2012-01-30 10:16 |只看该作者
本帖最后由 tdy218 于 2012-01-30 17:50 编辑

情形3发生时,当时以为是遇到标准错误事件了,后面的标准输出就不继续写了,后来弄了个小脚本实验了一下,发现是可以继续写入的,AIX下的真不太清楚还有啥情况能造成标准输出不继续写了。
  1. #!/bin/bash

  2. i=1

  3. for loop in 1 2 3 4 5
  4. do
  5.   if [ "$i" -eq "3" ]; then
  6.       tdy218
  7.   else
  8.       echo "i=$i"
  9.   fi
  10.   i=`expr $i + 1`
  11. done
复制代码
测试没问题,也就是说,不应该是stderr中断了stdout
[root@tdy218 ~]# ./Test.sh
i=1
i=2
./Test.sh: line 8: tdy218: command not found
i=4
i=5
[root@tdy218 ~]# ./Test.sh | cronolog Test.out
./Test.sh: line 8: tdy218: command not found
[root@tdy218 ~]# more Test.out
i=1
i=2
i=4
i=5


Linux下的好分析,AIX下的还真不太清楚。

论坛徽章:
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
3 [报告]
发表于 2012-01-30 12:03 |只看该作者
unbuffer试试

论坛徽章:
0
4 [报告]
发表于 2012-01-30 17:31 |只看该作者
回复 3# waker

我在IBM的developerWorks中见到过这样的解释,但不是太清楚,这一般是什么原因引起的那?

由于系统有时会对输入输出会进行缓存,因此有可能会碰到如下情况:执行了输出语句,但还是不见输出。尤其是在调试 Java/C++ 混合程序时容易发生这种情况,比如在 JNI 代码中的printf 就很可能被缓存后再输出。这种系统缓存机制很不利于调试程序,因为调试信息的及时输出很重要,很多时候要利用这些输出信息来判断程序的行为是否正常。
为了解决这个问题,可以调用 fflush:
(gdb)call (int)fflush(0)
这样所有的缓冲都会得到立刻刷新,包括 stdout 和 stderr . 调试者就能马上看到前面执行的输出的结果。


如果找不到原因,最差能手工的打开stdout也好,手工关闭stdout的方法我在网上看到过,可用gdb、exec 1>&-, >&-(这一种还不知道怎么用). 本来用gdb也可以重新打开stdout,我试了好几种方式,都没打开。call (int)fflush(0) 还没试过.




   

论坛徽章:
0
5 [报告]
发表于 2012-01-30 17:44 |只看该作者
本帖最后由 tdy218 于 2012-01-30 17:46 编辑

下面是Linux环境下的2组测试:

Shell脚本内容:
  1. -bash-3.2$ more start_adm.sh
  2. #!/bin/sh
  3. nohup ./startWebLogic.sh > nohup_adm.out 2>&1 &
复制代码
启动后,得到其进程号为23923.
-bash-3.2$ ps -ef|grep weblogic.Server
weblogic 23923 23881 59 01:54 pts/2    00:00:24 /middleware/wls1033/jdk160_18/bin/java -server -Xms512m -Xmx768m -XXermSize=128m -XX:MaxPermSize=128m .............. weblogic.Server


测试1. 手工关闭stdout前后的对比结果
关闭前:
-bash-3.2$ lsof -p 23923|grep nohup_adm.out
java    23923 weblogic    1w   REG      253,0     5920 3871359 /middleware/base_domain/bin/nohup_adm.out
java    23923 weblogic    2w   REG      253,0     5920 3871359 /middleware/base_domain/bin/nohup_adm.out


关闭后:
-bash-3.2$ lsof -p 23923|grep nohup_adm.out
java    23923 weblogic    2w   REG      253,0     5920 3871359 /middleware/base_domain/bin/nohup_adm.out


测试2. 用vi编辑nohup命令的输出文件nohup_adm.out,修改里面的文本,然后保存退出(这样的事儿,我见有人干过).

保存前:
-bash-3.2$ lsof -p 23923|grep nohup_adm.out
java    23923 weblogic    1w   REG      253,0     5920 3871359 /middleware/base_domain/bin/nohup_adm.out
java    23923 weblogic    2w   REG      253,0     5920 3871359 /middleware/base_domain/bin/nohup_adm.out


保存后:
-bash-3.2$ lsof -p 23923|grep nohup_adm.out
java    23923 weblogic    1w   REG      253,0     5920 3871359 /middleware/base_domain/bin/nohup_adm.out~ (deleted)
java    23923 weblogic    2w   REG      253,0     5920 3871359 /middleware/base_domain/bin/nohup_adm.out~ (deleted)



上面的2种形式在Linux环境下,都会使stdout停止写入,但不影响进程的正常工作。但一个进程,没人动,居然也中止了stdout的输出,真是奇怪,这其中的原因真是未知啊,想搜点英文资料看看解释,换了好多关键字都没搜到理想的结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP