免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: nees
打印 上一主题 下一主题

能不能用shell做一个队列  关闭 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-12-25 14:17 |只看该作者
楼主高人啊。

论坛徽章:
0
12 [报告]
发表于 2005-12-25 20:32 |只看该作者
我在linux下测试通过。

另外我写了一种变体,对于参数不是连续的也可以适用,请大家指正:

#!/bin/bash
tmpfile=$$.fifo
mkfifo $tmpfile
exec 4<>$tmpfile
rm $tmpfile   #以上工作---开一包间(一楼4号房间)
                                                                                
thred=4
seq=(1 2 3 4 5 6 7 8 9 21 22 23 24 25 31 32 33 34 35)
                                                                                
#
{
for (( i = 1;i<=${thred};i++ ))
do
echo;
done
} >&4
                                                                                
for id in ${seq[*]}
do
  read
  (./ur_command ${id};echo >&4 ) &
done <&4
wait

论坛徽章:
0
13 [报告]
发表于 2006-06-02 14:03 |只看该作者

初学linux,对nees兄和r2007兄的代码进行了一点自己的解释,请各位指点

#!/bin/bash
tmpfile=$$.fifo #创建管道名称
mkfifo $tmpfile #创建管道
exec 4<>$tmpfile #创建文件标示4,以读写方式操作管道$tmpfile
rm $tmpfile   #将创建的管道文件清除
                                                                                
thred=4 #指定并发个数
seq=(1 2 3 4 5 6 7 8 9 21 22 23 24 25 31 32 33 34 35) #创建任务列表
                                                                                
# 为并发线程创建相应个数的占位
{
for (( i = 1;i<=${thred};i++ ))
do
echo; #因为read命令一次读取一行,一个echo默认输出一个换行符,所以为每个线程输出一个占位换行
done
} >&4 #将占位信息写入管道
                                                                                
for id in ${seq
  • } #从任务列表 seq 中按次序获取每一个任务
    do
      read #读取一行,即fd4中的一个占位符
      (./ur_command ${id};echo >&4 ) & #在后台执行任务ur_command 并将任务 ${id} 赋给当前任务;任务执行完后在fd4种写入一个占位符
    done <&4 #指定fd4为整个for的标准输入
    wait  #等待所有在此shell脚本中启动的后台任务完成
    exec 4>&- #关闭管道

    整个流程中read 和 echo 对fd4的交替写入和读取是并发处理的关键
    可以想象 如果read 命令发现fd4中没有数据时 将等待fd4的数据

    如果可以自动kill掉超时的子任务就更好了
    摘录了一篇 放到了我的blog
    http://fallseir.livejournal.com/58761.html

    -0====================
    飞扬轻狂 http://feed.feedsky.com/fallseir
  • 论坛徽章:
    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
    14 [报告]
    发表于 2006-06-02 14:11 |只看该作者
    感谢楼上加注。

    论坛徽章:
    0
    15 [报告]
    发表于 2006-06-02 16:33 |只看该作者
    3楼楼长真牛!

    论坛徽章:
    0
    16 [报告]
    发表于 2006-06-18 18:15 |只看该作者
    原帖由 fallseir 于 2006-6-2 14:03 发表
    #!/bin/bash
    tmpfile=$$.fifo #创建管道名称
    mkfifo $tmpfile #创建管道
    exec 4<>$tmpfile #创建文件标示4,以读写方式操作管道$tmpfile
    rm $tmpfile   #将创建的管道文件清除
                           ...

    exec 4>&- #关闭管道

    脚本退出时会自动关闭这个管道吧?

    论坛徽章:
    0
    17 [报告]
    发表于 2008-06-12 14:55 |只看该作者
    问个弱问题
    一行里面只有一个冒号是什么意思? (下面的第4行)
    cat $FILENAME | while read LINE
    do
            echo "$LINE"
            :
    done

    论坛徽章:
    0
    18 [报告]
    发表于 2008-07-12 20:09 |只看该作者
    原帖由 vchenbing 于 2008-6-12 14:55 发表
    问个弱问题
    一行里面只有一个冒号是什么意思? (下面的第4行)
    cat $FILENAME | while read LINE
    do
            echo "$LINE"
            :
    done

    :是空命令,什么都不执行。

    论坛徽章:
    0
    19 [报告]
    发表于 2008-07-12 20:37 |只看该作者
    进来学习一下

    论坛徽章:
    0
    20 [报告]
    发表于 2008-07-13 00:44 |只看该作者
    没看太明白,自己再查查,很用力的慢慢消化
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

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

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP