shell 模拟线程,很有必要学习

回复 收藏
本帖最后由 Landon 于 2016-4-28 10:38 编辑

大家来写写,用shell 模拟线程的脚本 主要使用mkfifo  现在很多公司面试题都有考到,而且运用也挺多!
嗯。。这样说吧
1.大家先在百度搜搜shell 模拟多线程!

我们为什么要模拟出多线程呢?
你可以这样想想,如果我现在有这样一个需求,我要向200台机器发送文件,并且要ssh上去执行一些脚本!
这样你可想而知速度,一条条的执行,那工作速度也是慢的不要不要的!
而你模拟出线程来,例如我的最大线程数是20个,那么我同时在这20个里面工作,处理速度也比原来的快的多!

而如何模拟线程主要是通过mkfifo 创建管道 ,用for..do.. 循环规定的次数使用 echo空位来填充保持线程,然后通过读取空位后,填入执行的任务!
大家动手写吧。。。


这是一个模拟线程的实例:
cat ip.sh
update_script "10.0.0.10" "test1"
update_script "10.0.0.11" "test2"
update_script "10.0.0.12" "test3"
update_script "10.0.0.13" "test4"
update_script "10.0.0.14" "test5"

cat test_thread.sh
#!/bin/bash
#simulate_thread

##上传脚本
update_script (){
ssh -o StrictHostKeyChecking=no $1 "mkdir -p /data/$2"
rsync -avz /shell/test/ root@$1:/data/$2
}



temp_fifo=$$.info   
mkfifo $temp_fifo
exec 6<>$temp_fifo        ##对fd6进行读写
rm $temp_fifo

thread=5           ##定义线程数为5

for ((i=0;i<=$thread;i++))    ##开启线程并限定为 5
do
echo                        
done >&6            ##向fd6 echo 一个空位来维持线程              

file=$1   ##定义个一个file
exec 3<$file              ##把file定向到fd3
while read line <&3          ##使用while read line 读取fd3的每一行
do
exec_line=`echo $line|sed 's/"//g'`     
read -u6                         ##读取fd6的一行空位,使下面执行的命令能进入fd6
{
$exec_line                   ##执行的命令
echo >&6                     ##执行命令完毕后,继续执行echo占据一个空位,等待下次读取
} &                               ##加入到后台
done
wait                            ##等待所有线程完毕
exec 6>&-                      ##关闭fd6




2016-04-23 11:00 举报
已邀请:
0

ilinux

赞同来自:

不懂说的什么意思
0

Landon

赞同来自:

非常建议大家写写!这个搞懂了,shell基本难题不大了!就还剩下把正则弄牛B点,shell基本OK 了!一般用到这个 上面肯定全是function

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: