免费注册 查看新帖 |

Chinaunix

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

[文本处理] exec 問題 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:03
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-18 02:38 |只看该作者 |倒序浏览
本帖最后由 shihyu 于 2015-09-18 02:39 编辑
  1. log_file="log_file.txt"

  2. if [ -e $log_file ];then
  3.     rm $log_file
  4. fi

  5. exec &> >(tee -a "$log_file")
  6. echo This will be logged to the file and to the screen

  7. grep -ri --color "This" $log_file
复制代码
為什麼有時候會發生 grep: log_file.txt: No such file or directory ?

为什么有时候会发生 grep: log_file.txt: No such file or directory ?

是 exec 造成?

谢谢

论坛徽章:
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 [报告]
发表于 2015-09-18 08:26 |只看该作者
多进程的,不保证哪个先运行吧?

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
3 [报告]
发表于 2015-09-18 10:21 |只看该作者
你们能运行吗  我在bash 运行有语法错误

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
4 [报告]
发表于 2015-09-18 11:16 |只看该作者
sleep了 你不能重定向过去。。。

论坛徽章:
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
5 [报告]
发表于 2015-09-18 16:10 |只看该作者
本帖最后由 yjh777 于 2015-09-18 19:12 编辑

这个问题好,在我机器发现另外一个问题  exec >  >(tee logfile);  cat logfile 会构成一个死循环,
stdout 被输出了很多遍  ---> 详细原因见8楼


#  --- cat file -----> stdin->tee --------> file
#          ^                               |
#          |                               |
#          `-------------------------------/

  1. log_file="log_file.txt"

  2. if [ -e $log_file ];then
  3.         rm $log_file
  4. fi

  5. exec &> >(tee  "$log_file")
  6. echo This will be logged to the file and to the screen

  7. sleep 2
  8. grep -ri --color "This" $log_file
  9. echo kkkkkkk$((i++)) $

  10. cat $log_file     # <<<-----
  11. rm $log_file
复制代码

论坛徽章:
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
6 [报告]
发表于 2015-09-18 16:20 |只看该作者
回复 5# yjh777

这是一个bug吗?  我的 bash 版本 bash-4.3.42-1

大家运行结果是什么样?


   

论坛徽章:
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 [报告]
发表于 2015-09-18 17:42 |只看该作者
本帖最后由 yjh777 于 2015-09-18 19:14 编辑

看了一下,程序运行期间有三个进程:

22600 pts/1    S+     0:00          |   |       \_ bash kkk.sh
22601 pts/1    S+     0:00          |   |           \_ bash kkk.sh
22603 pts/1    S+     0:00          |   |           |   \_ tee log_file.txt

然后查看每个进程的 stdin stdout 信息:
while :; do  ps aux|grep -v grep| egrep tee || break; echo ------; sudo ls -l /proc/$(pgrep -f bash\ kkk.sh|head -n1)/fd; ls -l /proc/$(pgrep -f bash\ kkk.sh|tail -n1)/fd; ls -l /proc/$(pidof tee)/fd; done

------
总用量 0
lrwx------. 1 yjh yjh 64 9月  18 17:27 0 -> /dev/pts/1
l-wx------. 1 yjh yjh 64 9月  18 17:27 1 -> pipe:[1443883]
l-wx------. 1 yjh yjh 64 9月  18 17:27 2 -> pipe:[1443883]
lr-x------. 1 yjh yjh 64 9月  18 17:27 255 -> /home/yjh/kkk.sh
总用量 0
lr-x------. 1 yjh yjh 64 9月  18 17:27 0 -> pipe:[1443883]
lrwx------. 1 yjh yjh 64 9月  18 17:27 1 -> /dev/pts/1
lrwx------. 1 yjh yjh 64 9月  18 17:27 2 -> /dev/pts/1
总用量 0
lr-x------. 1 yjh yjh 64 9月  18 17:27 0 -> pipe:[1443883]
lrwx------. 1 yjh yjh 64 9月  18 17:27 1 -> /dev/pts/1
lrwx------. 1 yjh yjh 64 9月  18 17:27 2 -> /dev/pts/1
l-wx------. 1 yjh yjh 64 9月  18 17:27 3 -> /home/yjh/log_file.txt

从每个进程的fd信息来看,并没有死循环,那么是什么原因呢?
    是不是 tee 的父进程的stdin使用了同一个管道信息,导致tee读取stdin后 数据仍然保留?   我再想想,,,

-------------------
此处方向错误,其实是最后的 cat log_file 导致了死循环,详见8楼

论坛徽章:
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
8 [报告]
发表于 2015-09-18 18:35 |只看该作者
本帖最后由 yjh777 于 2015-09-18 18:51 编辑

问一下同事搞清楚了,发现是最后的cat $log_file 跟 tee $log_file 造成了循环.

而且在双核(或多核)的物理机复现不出来,只有在单核的虚拟机才能复现出来:
     tee 获取cpu 读管道文件读取内容写入 logfile ,并等待EOF或管道破裂

     cat 获取cpu 打开 logfile 读取内容写入 管道(stdout被重定向到管道),如果(还没有到EOF)
     tee 被 唤 醒(因为管道里又有内容了),读取内容写入 logfile
     ... 重复上面两个操作

     cat 获取cpu 继续读 logfile 并写入管道;  时间片还没有用完 并且已经到了 EOF, 进程推出
     tee 发现管道关闭 也退出

论坛徽章:
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 [报告]
发表于 2015-09-18 19:26 |只看该作者
回复 8# yjh777

其实简化了写就是这样:
  { echo kkk; sleep 0.1; cat log; } | tee log


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP