免费注册 查看新帖 |

Chinaunix

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

[文本处理] shell中重定向是否是线程安全的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-06 16:55 |只看该作者 |倒序浏览
本帖最后由 dandy1992 于 2014-05-06 17:04 编辑

在工作编写脚本的时候,因为数据量比较大,经常要写入一个文件中,因此用了shell的多线程处理,我想询问下各位shell大牛对管道线程安全的理解,个人觉得不是线程安全的,下面是我的测试脚本
  1.    echo {0..10000} >> a.tmp &
  2.                  echo  {0..10000} >> a.tmp &
  3.                  echo {0..10000} >> a.tmp &
  4.                  echo {0..10000} >> a.tmp


  5.                 wait                    
  6.                 awk '{a+=NF;print NF}END{print a;}'  a.tmp  
复制代码
测试结果输出是

  1. 10001
  2. 10001
  3. 19439
  4. 563
  5. 40004
复制代码
因为每个echo都有一个换行,所以肯定有4行,如果每行都有10001个数据,那就说明是线程安全的,但测试结果每行数据量不一致
shell内部原理理解不深,望各位指教

论坛徽章:
1
水瓶座
日期:2014-05-16 13:42:25
2 [报告]
发表于 2014-05-06 19:47 |只看该作者
10001
10001
10001
10001
40004

我的测试结果是正确的,不过我只是一个shell在对这个文件进行操作,楼主是多个shell同时对这个文件进行读写吧?

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
3 [报告]
发表于 2014-05-06 20:08 |只看该作者
本帖最后由 李满满 于 2014-05-06 20:16 编辑

$ ./yhsafe.sh
10001
10001
10001
10001
40004
说明:楼主说的对,因为你没有把代码放在同一个子shell中执行,你可以试下这样
$ cat yhsafe.sh
set -x
(echo {0..10000} >> a.tmp
echo {0..10000} >> a.tmp )&  --把要多线程处理的东西都放在同一个shell中进行,这样你就不会出现上面的情况了..
wait                                                                           
awk '{a+=NF;print NF}END{print a;}'  a.tmp

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
4 [报告]
发表于 2014-05-06 20:20 |只看该作者
我曾做过测试,不安全,需要通过技术手段来规避

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
5 [报告]
发表于 2014-05-06 20:44 |只看该作者
不知道楼主指的是不是flock解决多线程安全问题的?也想了解一下嗯
damcool 发表于 2014-05-06 20:20
我曾做过测试,不安全,需要通过技术手段来规避

论坛徽章:
0
6 [报告]
发表于 2014-05-06 20:46 |只看该作者
是的,多个线程管道的,应该是线程不安全的回复 2# helloworld_gm


   

论坛徽章:
0
7 [报告]
发表于 2014-05-06 20:48 |只看该作者
回复 5# 李满满

额,个人觉得重定向 其实是基于字节流进行操作的,所以肯定有对应的缓冲区,数据过大会启动多次缓冲区,缓冲区之间应该不是线程安全的
   

论坛徽章:
1
水瓶座
日期:2014-05-16 13:42:25
8 [报告]
发表于 2014-05-06 20:54 |只看该作者
回复 6# dandy1992


   嗯,那估计就是多个线程影响着,不知道在多线程的情况下shell有什么好的同步控制方法?

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
9 [报告]
发表于 2014-05-06 21:43 |只看该作者
用unix domain socket了

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
10 [报告]
发表于 2014-05-06 21:52 |只看该作者

李满满 发表于 2014-05-06 20:44
不知道楼主指的是不是flock解决多线程安全问题的?也想了解一下嗯


没那么复杂,mkdir就解决了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP