免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9305 | 回复: 10

[其他] 即时输出并记日志文件 及 exec重定向 [复制链接]

论坛徽章:
0
发表于 2012-10-15 14:09 |显示全部楼层
本帖最后由 hujysh 于 2012-10-16 10:26 编辑

希望实现一个功能,想找个方便些的方法。

shell脚本,很多语句,希望所有的标准输出及错误输出都即时显示在屏幕(以方便监视),程序运行完还希望所有那些输出记录在日志文件

我知道
prgname 2>&1 | tee -a LOGFILE
能实现

但是不希望在运行时候加 管道,可以在程序内部就实现这个功能吗?程序里面该如何写?

把这句话:
prgname 2>&1 | tee -a LOGFILE  单独写成一个程序当然也能实现;

或者

fun() {...}
fun 2>&1 | tee -a LOGFILE  
也能实现;

但是还有没有别的方法?
用exec重定向可以同时输出到屏幕吗?

求答案。。。
本问题特请 blackold大侠 发表下看法  8楼9楼给了个可行的方法 可是还是嫌麻烦

论坛徽章:
0
发表于 2012-10-15 15:33 |显示全部楼层
没有人理啊。

fun 2>&1 | tee -a LOGFILE
为什么不想用呢? 一个是很不爽,什么都包进去,本来不是函数的概念;还一个是 因为加了管道,fun里面的变量带不出来。

有没有好办法呢?

论坛徽章:
0
发表于 2012-10-15 15:55 |显示全部楼层
回复 1# hujysh


    tail -f  ?
不用管脚本代码,里面只管添加日志就行了,tail -f 会在日志文件发生变化时,输出追加的日志内容。。

论坛徽章:
0
发表于 2012-10-15 16:06 |显示全部楼层
回复 3# personball


实际情况不是单一的一个程序,只有一个的话可以直接记log文件,再tail -f来监控

实际是该小程序只是一个大程序中的一个步骤,监控只针对这个大程序进行,所以希望小程序能有直接输出。

论坛徽章:
0
发表于 2012-10-15 16:23 |显示全部楼层
给一个小例子,
  1. #!/bin/sh

  2. mainfun()
  3. {
  4.    ls abc  #some commands
  5.    ret=$?
  6.    echo in mainfun, ret is [$ret]
  7. }

  8. ret=0
  9. mainfun 2>&1 | tee x.log
  10. echo after mainfun, ret is [$ret]
  11. exit $ret
复制代码
本来期望exit code是mainfun中赋值过的ret,但是达不到效果。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2012-10-15 17:10 |显示全部楼层
不知道是不是很简单,只需要
#!/bin/sh

set -x
.....

即可?

论坛徽章:
0
发表于 2012-10-15 17:18 |显示全部楼层
回复 6# expert1


不是啊。。。

请以5楼的例子看,
我希望标准输出  和 错误输出 都写入日志文件 x.log
同时希望 输出能即时显示
还希望能得到正确的返回码

set -x 把执行过程打出来了,可是。。。

多谢!

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
发表于 2012-10-15 18:08 |显示全部楼层
试试
  1. #!/bin/bash

  2. process()
  3. {
  4.     ls abc
  5.     date
  6.     sleep 2
  7. }

  8. LOGFILE="/tmp/log.txt"
  9. touch $LOGFILE
  10. tail -f $LOGFILE &
  11. pid=$!

  12. exec 3>&1
  13. exec 4>&2
  14. exec &>$LOGFILE
  15. process
  16. ret=$?
  17. exec 1>&3 3>&-
  18. exec 2>&4 4>&-

  19. kill -15 $pid

  20. exit $ret
复制代码

论坛徽章:
0
发表于 2012-10-16 09:29 |显示全部楼层
回复 8# winway1988


谢谢!

这个回复不错,基本思想可以采纳,再完善一下可以使用,
需要加 意外中止时对 tail -f 进程的处理;
由于日志文件每次执行应该追加,而tail -f会将整个文件输出,所以得采用临时文件,程序意外中止时也应维护临时文件。

我本以为要求是很简单的,可是实现起来却蛮麻烦。
   

论坛徽章:
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
发表于 2012-10-19 13:33 |显示全部楼层
回复 1# hujysh


    汗,是 expert1 提醒我来看的。:wink:

   汗,首先我还配不上"特请“啥的,坛里只是 W神有这个资格。

   可以考虑用 compound command 或 FIFO。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP