引言

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 = 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!"fififi
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} ];thenrm -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} ];thenrm -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};
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 stoped
waitecho "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-28opr1=x
opr2=x
opr3=xwhile [ -n "$(echo $1 | grep '-')" ];docase $1 in-h | --help)echo "./test.sh -opr1 a -opr2 b -opr3 c"exit 0;;-opr1)opr1=$2shift;;-opr2)opr2=$2shift;;-opr3)opr3=$2shift;;esacshiftdoneecho "opr1=${opr1}  opr2=${opr2}  opr3=${opr3}"

验证结果:

4,小结

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

转载于:https://www.cnblogs.com/mengfanrong/p/4070930.html

朝花夕拾-4-shell相关推荐

  1. jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理

    准备步骤: 1.安装java环境,知道java安装目录 2.将jar包拖放或发送至服务器中(目录自定义) 一.编写shell脚本,将以下代码放在shell脚本中,将shell脚本放在jar包同级目录下 ...

  2. Linux shell 学习笔记(16)— shell 入门总结

    1. Shell 变量 Shell 变量包括自定义变量和环境变量: 自定义变量:脚本中自己命名定义的变量,通常为局部变量,其他 Shell 程序不能访问到: 环境变量,操作系统已定义的变量,如 PAT ...

  3. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行

    1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...

  4. Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务

    1. 处理信号 1.1 Linux 信号 常见的 Linux 信号如下表所示: 信号 值 描述 1 SIGHUP 挂起进程 2 SIGINT 终止进程 3 SIGQUIT 停止进程 9 SIGKILL ...

  5. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  6. Linux shell 学习笔记(10)— 处理用户输入(命令行读取参数、读取用户输入、超时处理)

    1. 命令行参数 向 shell 脚本传递数据的最基本方法是使用命令行参数.命令行参数允许在运行脚本时向命令行添加数据. $ ./addem 10 30 本例向脚本 addem 传递了两个命令行参数( ...

  7. Linux shell 学习笔记(9)— 循环语句(for、while)以及更改字段分隔符

    1. for 语句 bash shell 中 for 命令的基本格式如以下,$var 变量包含着这次迭代对应的当前列表项中的值. for var in list docommands done 也可以 ...

  8. Linux shell 学习笔记(8)— 使用结构化命令(if-then 语句、数值比较、字符串比较、文件比较、case 语句)

    1. 使用 if-then 语句 最基本的结构化命令就是if-then语句.if-then语句有如下格式. if command then ​ commands fi 或者 if command; t ...

  9. Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)

    1. 使用多个命令 如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. $ date ; who Mon Feb 21 15:36:09 EST 2014 Christine tty2 ...

最新文章

  1. 在Windows2016中回到DOS时代用tt练习打字
  2. ViewFlipper的功能和用法
  3. 如何使用github搭建个人博客
  4. httpHandlers和httpModules接口介绍 (5)
  5. 前端学习(759):预解析案例
  6. python exchangelib 删除邮件_Python优雅的操作Exchange邮箱——exchangelib模块使用介绍...
  7. Linux服务器集群系统(二)——LVS集群的体系结构
  8. MySQL存储过程 — 解析 XML 数据并实现插入操作
  9. 在电脑窗口中截取长图/滚动截图
  10. WSO2流处理器相关学习(1)快速入门指南【转】
  11. android模拟器克隆app,易语言一键克隆/启动安卓模拟器
  12. 半导体随机存储器(random access memory)
  13. 蓝牙耳机厂家新品发布——ANC主动降噪耳机U2065
  14. 音乐学院排名计算机音乐,中国九大音乐学院排名
  15. 牛顿(Newton)方法
  16. 300ETF期权适合进行短线交易吗?
  17. 批处理应用:IE问题修复
  18. 【杂篇 · 电脑】买Macbook之后的一些记录
  19. Make my mind tobe a coder! Wa kakak
  20. 三极管做开关,常用到的电容作用

热门文章

  1. 先虚拟主机后云服务器,先虚拟主机后云服务器
  2. 改善深层神经网络:超参数调整、正则化以及优化——2.8 Adam算法(Adaptive Moment Estimation)
  3. 去哪儿-04-iconsDev
  4. IPC--进程间通信一(管道)
  5. Matlab--绘图总结
  6. 完成简单的四则运算(包含小括号)(栈)
  7. 基于深度学习的文本分类2
  8. 线性代数【8】-1 线性方程组
  9. android横向多布局约束,Android约束布局中心水平对齐Textview和Imageview不工作
  10. python设置tk退出_退出tkinter gui