朝花夕拾-4-shell
引言
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相关推荐
- jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理
准备步骤: 1.安装java环境,知道java安装目录 2.将jar包拖放或发送至服务器中(目录自定义) 一.编写shell脚本,将以下代码放在shell脚本中,将shell脚本放在jar包同级目录下 ...
- Linux shell 学习笔记(16)— shell 入门总结
1. Shell 变量 Shell 变量包括自定义变量和环境变量: 自定义变量:脚本中自己命名定义的变量,通常为局部变量,其他 Shell 程序不能访问到: 环境变量,操作系统已定义的变量,如 PAT ...
- 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行
1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...
- Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务
1. 处理信号 1.1 Linux 信号 常见的 Linux 信号如下表所示: 信号 值 描述 1 SIGHUP 挂起进程 2 SIGINT 终止进程 3 SIGQUIT 停止进程 9 SIGKILL ...
- Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)
1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...
- Linux shell 学习笔记(10)— 处理用户输入(命令行读取参数、读取用户输入、超时处理)
1. 命令行参数 向 shell 脚本传递数据的最基本方法是使用命令行参数.命令行参数允许在运行脚本时向命令行添加数据. $ ./addem 10 30 本例向脚本 addem 传递了两个命令行参数( ...
- Linux shell 学习笔记(9)— 循环语句(for、while)以及更改字段分隔符
1. for 语句 bash shell 中 for 命令的基本格式如以下,$var 变量包含着这次迭代对应的当前列表项中的值. for var in list docommands done 也可以 ...
- Linux shell 学习笔记(8)— 使用结构化命令(if-then 语句、数值比较、字符串比较、文件比较、case 语句)
1. 使用 if-then 语句 最基本的结构化命令就是if-then语句.if-then语句有如下格式. if command then commands fi 或者 if command; t ...
- Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)
1. 使用多个命令 如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. $ date ; who Mon Feb 21 15:36:09 EST 2014 Christine tty2 ...
最新文章
- 在Windows2016中回到DOS时代用tt练习打字
- ViewFlipper的功能和用法
- 如何使用github搭建个人博客
- httpHandlers和httpModules接口介绍 (5)
- 前端学习(759):预解析案例
- python exchangelib 删除邮件_Python优雅的操作Exchange邮箱——exchangelib模块使用介绍...
- Linux服务器集群系统(二)——LVS集群的体系结构
- MySQL存储过程 — 解析 XML 数据并实现插入操作
- 在电脑窗口中截取长图/滚动截图
- WSO2流处理器相关学习(1)快速入门指南【转】
- android模拟器克隆app,易语言一键克隆/启动安卓模拟器
- 半导体随机存储器(random access memory)
- 蓝牙耳机厂家新品发布——ANC主动降噪耳机U2065
- 音乐学院排名计算机音乐,中国九大音乐学院排名
- 牛顿(Newton)方法
- 300ETF期权适合进行短线交易吗?
- 批处理应用:IE问题修复
- 【杂篇 · 电脑】买Macbook之后的一些记录
- Make my mind tobe a coder! Wa kakak
- 三极管做开关,常用到的电容作用