shell 并发
Posted chenzechao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 并发相关的知识,希望对你有一定的参考价值。
TODO
https://blog.csdn.net/spch2008/article/details/51433353
#!/bin/bash start_time=`date +%s` #定义脚本运行的开始时间 [ -e /tmp/fd1 ] || mkfifo /tmp/fd1 #创建有名管道 exec 3<>/tmp/fd1 #创建文件描述符,以可读(<)可写(>)的方式关联管道文件,这时候文件描述符3就有了有名管道文件的所有特性 rm -rf /tmp/fd1 #关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除,我们留下文件描述符来用就可以了 for ((i=1;i<=10;i++)) do echo >&3 #&3代表引用文件描述符3,这条命令代表往管道里面放入了一个"令牌" done for ((i=1;i<=1000;i++)) do read -u3 #代表从管道中读取一个令牌 sleep 1 #sleep 1用来模仿执行一条命令需要花费的时间(可以用真实命令来代替) echo ‘success‘$i echo >&3 #代表我这一次命令执行到最后,把令牌放回管道 & done wait stop_time=`date +%s` #定义脚本运行的结束时间 echo "TIME:`expr $stop_time - $start_time`" exec 3<&- #关闭文件描述符的读 exec 3>&- #关闭文件描述符的写 #!/bin/bash token() # 创建有名管道,如果fd1不存在则创建 [ -e /tmp/fd1 ] || mkfifo /tmp/fd1 # 创建文件描述符,以可读(<)可写(>)的方式关联管道文件,这时候文件描述符999就有了有名管道文件的所有特性 exec 4<>/tmp/fd1 # 关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除,我们留下文件描述符来用就可以了 [ -e /tmp/fd1 ] && rm -f /tmp/fd1 # 初始化并行数 for ((i=1;i<=3;i++)) do # &999代表引用文件描述符999,这条命令代表往管道里面放入了一个"令牌" echo >&4 done main() pid=5 # 生成管道文件 token $pid # 循环获取服务包名 for file_name in `ls /root/spark/dependency/*.jar` do echo ‘-------------------restart ‘ $file_name ‘-------------------------‘ # 获取令牌 read -u999 # 根据文件名去掉版本后缀,获得服务名 # svc_name=$file_name%0.0.1* # 获取启动参数 # get_para # 执行重启 # one_restart # 这一次命令执行到最后,把令牌放回管道 echo $file_name sleep 1 echo >&$pid & done wait # 定义脚本运行的结束时间 stop_time=`date +%s` echo "TIME:`expr $stop_time - $start_time`" # 关闭文件描述符的读 exec $pid<&- # 关闭文件描述符的写 exec $pid>&- main
以上是关于shell 并发的主要内容,如果未能解决你的问题,请参考以下文章