引言

shell,我们常常会用到,以其强大的功能,会帮助我们解决非常多棘手的问题。近期遇到一个问题,要跑非常多case,假设串行的执行,须要非常久。能不能让他们并行起来,但又不能全部case都并行执行呢?,由于全部case同一时候执行,机器会挂掉的。

1,方式1

比較直接的一种方式是,维护两个文件队列(*.start和*.stop)分别记录全部case的执行状态,然后依据并发数量来获取和分配资源。

代码例如以下:

multi.sh:

#!/bin/bash

#Rill create to run cases parallel
#2014-05-22 #mkdir ./case_status
#declare -i pc_num
readonly pc_num = 3
case_list = "a b c d e f" function get_start_num()
{
num = 0
for var in $case_list
do
if [ -e $var.start -a -f $var.start]; then
num = num + 1
fi
done return $num
} function get_case_stop()
{
case $1 in
"a")
echo "get case: $1 not stop"
rerurn 0
;; "b")
echo "get case: $1 stop"
return 1
;; "c")
echo "get case: $1 not stop"
rerurn 0
;; "d")
echo "get case: $1 stop"
rerurn 1
;; "e")
echo "get case: $1 stop"
rerurn 1
;; "f")
echo "get case: $1 stop"
rerurn 1
;; *)
echo "case $1 not exist"
exit 1;
;;
} for each_d in ${case_list};
do
if [ get_start_num -lt $pc_num ];then
if [ ! -e $each_d.start ]; then
if [ ! -e $each_d.stop ]; then
touch $each_d.start
#start one new case
else
echo "$each_d already stoped"
rm $each_d.start
fi else
if [ ! -e $each_d.stop ]; then
echo "$each_d running......"
if[ get_case_stop $each_d eq 1];then
touch $each_d.stop
rm $each_d.start
fi
else
echo "$each_d error!"
fi fi
fi
done

须要注意的是採用这样的方式的话,须要获得每一个case的结束状态,这个能够通过case执行结束时的输出log中分析得到。

尽管有awk等强大的工具,可是,分析获得不同case的结束信息仍然是一项艰巨的任务。

有没有其它的方式呢?

有。

2,方式2

细致分析全部的cases開始,结束的情景,发现和fifo文件的特性非常相似,于是就想到用fifo来实现并发控制。

例如以下:

multi.sh:

#!/bin/bash

#Rill create to run cases parallel
#2014-05-22 case_list="a b c d e f g h i j k l m n o" readonly parallel_num=3
readonly fifo_id=9
readonly fifo_name=fd2
readonly log_name=log.log #create log file
if [ -e ${log_name} -a -f ${log_name} ];then
rm -f ${log_name}
fi
touch ${log_name}
echo "all cases begin time:$(date +%Y-%m-%d-%H:%M:%S)" >>${log_name} #create fifo file
if [ -e ${fifo_name} -a -f ${fifo_name} ];then
rm -f ${fifo_name}
fi
mkfifo ${fifo_name} #bind fifo to fifo_id
eval "exec ${fifo_id}<>${fifo_name}" #init fifo
for (( idx=0;idx<${parallel_num};idx=idx+1 ))
do
echo -n -e "1\n" >>${fifo_name}
done #multi main body
for each_case in ${case_list};
do
read -u ${fifo_id}
{
echo "${each_case} start:$(date +%Y-%m-%d-%H:%M:%S)" >>${log_name}
sleep 1 #case running
echo "${each_case} stoped:$(date +%Y-%m-%d-%H:%M:%S)" >>${log_name}
echo -ne "1\n" >>${fifo_name}
} &
done #wait all the cases stoped
wait echo "all cases finish time:$(date +%Y-%m-%d-%H:%M:%S)" >>${log_name} #remove the fifo
rm -f ${fifo_name}

从中能够发现,我们不须要再为获得case的结束状态而烦恼了。

以下是执行结果,一共15个case,每一个case执行1秒,并发数量设置为3,全部case执行完须要6.4秒左右。

3,shell參数传递

平时我们在使用shell脚本时,往往要向脚本中指定參数,这些參数能够直接写在命令行的后面,可是这样做对參数顺序要求非常强,使用起来比較困难。

这时我们能够通过在參数前面添加标示来实现。

#!/bin/bash

#
# shell test
# Rill
# 2014-09-28 opr1=x
opr2=x
opr3=x while [ -n "$(echo $1 | grep '-')" ];do
case $1 in
-h | --help)
echo "./test.sh -opr1 a -opr2 b -opr3 c"
exit 0
;;
-opr1)
opr1=$2
shift
;; -opr2)
opr2=$2
shift
;; -opr3)
opr3=$2
shift
;; esac shift done echo "opr1=${opr1} opr2=${opr2} opr3=${opr3}"

验证结果:

4,小结

shell非常久都不用了,本小结就当“朝花夕拾”吧。

朝花夕拾-4-shell的更多相关文章

  1. Shell替换

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...

  2. Shell特殊变量

    $ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...

  3. shell变量

    定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...

  4. 第一个shell脚本

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...

  5. shell简介

    Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...

  6. Shell碎碎念

    1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...

  7. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

  8. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  9. Linux环境下shell和vim中乱码原因及消除办法

    shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...

随机推荐

  1. hihocoder第42周 k*N骨牌覆盖(状态dp+矩阵快速幂)

    上周的3*N的骨牌,因为状态只有8中,所以我们可以手算出状态转移的矩阵 但是这周是k*N,状态矩阵不好手算,都是我们改成用程序自动生成一个状态转移的矩阵就行了,然后用这个矩阵进行快速幂即可 枚举枚举上 ...

  2. 网站可以免费做业务CMS讨论

    中国现在用PHPCMS   DEDECMS织梦    科学新闻CMS  帝国.Discuz.Ecshop等待,但他们个人利益免费,业务.政府.授权费. 什么CMS它可以自由地做商务网站? 考虑到下面几 ...

  3. mysql重装后出现乱码解决办法

    查看当前连接系统参数:SHOW VARIABLES LIKE '%char%'; mysql> show variables like 'char%'; +------------------- ...

  4. WCF扩展之实现ZeroMQ绑定和protocolBuffer消息编码(一)概要设计

      在我工作的项目中含有多种操作系统.多种设备.多种开发语言,因此需要使用跨平台的通信技术和自定义的消息编码.经过技术调研,ZeroMQ+ProtocolBuffer最终成为通信技术和编码方式.但是如 ...

  5. GIT用服务器上的版本强制覆盖掉本地的版本(转)

    以前在机子上使用git下载了linux git版本库上的源代码,由于在阅读源代码的过程中,难免会对本地的文件进行修改,这样就导致本地文件与服务器上的文件版本不一致,我想做的就是用服务器上的版本强制覆盖 ...

  6. 栈实现java

    栈是一种“先去后出”的抽象的数据结构.例如:我们在洗盘子的时候,洗完一个盘子,将其放在一摞盘子的最上面,但我们全部洗完后,要是有盘子时,我们会先从最上面的盘子开始使用,这种例子就像栈的数据结构一样,先 ...

  7. decorate pattern 装饰模式

    [装饰模式的优缺点]装饰模式的优点:1.比静态继承更灵活:2.避免在层次结构高层的类有太多的特征装饰模式的缺点:1.使用装饰模式会产生比使用继承关系更多的对象.并且这些对象看上去都很想像,从而使得查错 ...

  8. 在mac os下编译android -相关文章

    1. Mac OS X下编译Android源码 http://blog.csdn.net/bulreed/article/details/22783467 2.MAC OS 编译 Android源代码 ...

  9. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  10. java中用正則表達式推断中文字符串中是否含有英文或者数字

    public static boolean includingNUM(String str)throws  Exception{ Pattern p  = Pattern.compile(" ...