朝花夕拾-4-shell

來源:互聯網
上載者:User

標籤:blog   http   io   ar   使用   for   檔案   div   on   

引言

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_numreadonly pc_num = 3case_list = "a b c d e f"function get_start_num(){num = 0for var in $case_listdoif [ -e $var.start -a -f $var.start]; thennum = num + 1fidonereturn $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};doif [ get_start_num -lt $pc_num ];thenif [ ! -e $each_d.start ]; thenif [ ! -e $each_d.stop ]; thentouch $each_d.start#start one new caseelseecho "$each_d already stoped"rm $each_d.startfielseif [ ! -e $each_d.stop ]; thenecho "$each_d running......"if[ get_case_stop $each_d eq 1];thentouch $each_d.stoprm $each_d.startfielseecho "$each_d error!"fififidone

須要注意的是採用這樣的方式的話,須要獲得每一個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=3readonly fifo_id=9readonly fifo_name=fd2readonly log_name=log.log#create log fileif [ -e ${log_name} -a -f ${log_name} ];thenrm -f ${log_name}fitouch ${log_name}echo "all cases begin time:$(date +%Y-%m-%d-%H:%M:%S)" >>${log_name}#create fifo fileif [ -e ${fifo_name} -a -f ${fifo_name} ];thenrm -f ${fifo_name}fimkfifo ${fifo_name}#bind fifo to fifo_ideval "exec ${fifo_id}<>${fifo_name}"#init fifofor (( idx=0;idx<${parallel_num};idx=idx+1 ))doecho -n -e "1\n" >>${fifo_name}done#multi main bodyfor each_case in ${case_list};doread -u ${fifo_id}{echo "${each_case} start:$(date +%Y-%m-%d-%H:%M:%S)" >>${log_name}sleep 1  #case runningecho "${each_case} stoped:$(date +%Y-%m-%d-%H:%M:%S)" >>${log_name}echo -ne "1\n" >>${fifo_name}} &done#wait all the cases stopedwaitecho "all cases finish time:$(date +%Y-%m-%d-%H:%M:%S)" >>${log_name}#remove the fiform -f ${fifo_name}


從中能夠發現,我們不須要再為獲得case的結束狀態而煩惱了。

以下是執行結果,一共15個case,每一個case執行1秒,並發數量設定為3,全部case執行完須要6.4秒左右。





3,shell參數傳遞

平時我們在使用shell指令碼時,往往要向指令碼中指定參數,這些參數能夠直接寫在命令列的後面,可是這樣做對參數順序要求非常強,使用起來比較困難。

這時我們能夠通過在參數前面添加標示來實現。


#!/bin/bash## shell test# Rill# 2014-09-28opr1=xopr2=xopr3=xwhile [ -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        shiftdoneecho "opr1=${opr1}  opr2=${opr2}  opr3=${opr3}"


驗證結果:




4,小結

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


朝花夕拾-4-shell

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.