本帖最后由 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
大家来写写,用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
编辑回复