shell并发执行示例
shell并发执行示例
背景:从服务器上抽取出来的IP需要调用接口查询IP地址所在地,直接for循环使用&后台并行查询接口时,有可能受到接口的限制,会导致获取失败; 故采用批量查询的方法,一次查询n个,查询完后在执行下一次查询
#!/bin/bash
exec 200<>$0
flock -n -e 200 || { echo "already Running, exit!";exit 1; }
trap 'rm -f ipinfo.txt;exit' 0 1 2 3 15
nums="$1"
[ -z "$nums" ] && nums=20
function get_ip_info(){
ip_array=("$1")
for ipaddr in ${ip_array[@]}
do
ipaddr=$(echo "$ipaddr"|tr -d '\r')
ip_info=$(curl -m 3 --retry 1 http://ip.sysop.duowan.com/ipDesc.php?ip=${ipaddr} 2>/dev/null|grep "info: " | sed 's/info: //g')
if [ "$ip_info" == "" ];then
[ "$ip_info" == "" ] && ip_info="未确定地址信息"
fi
echo "${ipaddr};${ip_info}" >> ipinfo.txt
done
}
ip_count=$(wc -l iplist.txt|awk '{print $1}')
for(( i=1;i<="$ip_count";i= i + "$nums" ))
do
j=$(( $i + $nums -1 ))
ip_array=$(sed -n ""$i","$j"p" iplist.txt)
get_ip_info "$ip_array" &
done
wait
nums为并行查询数量
iplist.txt为存放IP的文件 例:
1.1.1.1
2.2.2.2
……
ipinfo.txt为存放获取的IP信息文件,例
1.1.1.1 中国,广东,广州 电信
2.2.2.2 中国,广东,广州 联通
……