您的位置:首页 > 运维架构 > Shell

shell并发

2016-09-06 12:13 441 查看
1.并发->服务器端执行ip -a命令并返回结果
# cat ip_only
192.168.36.149
192.168.36.144

#!/bin/bash
Usage:return the server command 'ip a'
Author:chengyanli
Date:2016/08/18
thead_num=2 # 自定义并发数,根据自身服务器性能或应用调整大小,
开始千万别定义太大,避免管理机宕机
mkfifo $tmp_fifo_file #创建临时管道文件
exec 4<>$tmp_fifo_file #以读写方式打开管道文件,文件描述符为4,
取3-9任意文件描述符
rm -f $tmp_fifo_file #删除临时管道文件,也可以不删除
for ((i=0;i<$thead_num;i++)) #利用for循环向管道中输入并发数量的空行
do
echo " " #输出空行
done >&4 #输出重定向到定义的文件描述符4上
for ip in `cat /mnt/ip_only` #循环所有执行的服务器
do
read -u4 #从管道中读取行,每次一行,所有行读完后执行挂起,直到管道有空闲的行
{ #批量执行的命令放在大括号内
ssh ${ip} "ip a" #在服务器上执行ip a命令
sleep 3 #暂停3秒,给系统缓冲时间,达到限制并发进程数量
echo >&4 #再写入一个空行,使挂起的循环管继续执行
}& #放入后台执行
done
wait #等待所有进程执行完成
exec 4>&- #删除文件描述符
exit 0

2.并发->监控服务器磁盘使用情况,大于80%报警
# cat ip_only
192.168.36.151
192.168.36.144

# vim bingfa.sh
#!/bin/bash
Usage:if disk use>80%,give an alarm
Author:chengyanli
Date:2016/08/18
USER=742019722@qq.com
flag=0 #标志变量
thead_num=2
mkfifo testfifo
exec 4<>testfifo
rm -f testfifo
for ((i=0;i<$thead_num;i++))
do
echo >&4
done
for ip in `cat /mnt/ip_only`
do
read -u4
{
ssh root@${ip} "df -h|awk -F '%' '{print \$1}'|awk '{print \$1,\$5,"\n"}'|sed '1d'" > result #将服务器的磁盘使用情况返回至文件result
for i in `cat result|awk '{print $2}'` #提取磁盘的使用量
do
if [ ${i} -gt 80 ];then
j=`grep -w '$i' result|awk '{print $1}'` #提取磁盘的的名称
echo -e "Notice:${ip} "${j}" use>80%,plz do something:\n\n`df -h`\n\n`date +%Y-%m-%d`"|mail -s 'WARNING' $USER
flag=1; #若磁盘使用空间>80%,报警并将变质变量置为1
fi
done
sleep 3
echo >&4
}&
done
if [ $flag = 0 ];then #若标志变量为0,则所有磁盘ok
echo "all disk is ok!!!"
else
exit
fi
wait
exec 4>&-
exec 4<&-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell