1、今天分享一个以前坐项目使用过的巡检脚本,是使用bash shell 去编写的,对于经常使用shell脚本去完成日常巡检的同行,非常有借鉴作用;
2、脚本使用的一些变量以及模块都很有用,如果是初学习shell的脚本使用,参考这个脚本,绝对能让你快速的提升,具体代码如下:
1#!/bin/bash 2############################################################## 3#脚本用于对服务器各资源,服务进程等信息采集。 4############################################################# 5 6 7TIME=`date +"%Y-%m-%d-%H-%M"` 8 9#30:黑,31:红,32:绿,33:黄,34:蓝色,35:紫色,36:深绿 10#red:31 green:32 yellow:33 blue:34 purple:35 darkgreen:36 11 12#颜色设置 13RED(){ 14 val=$1 15 echo -e "\033[31m ${val} \033[0m" 16} 17 18GREEN(){ 19 val=$1 20 echo -e "\033[32m ${val} \033[0m" 21} 22YELLOW(){ 23 val=$1 24 echo -e "\033[33m ${val} \033[0m" 25} 26BLUE(){ 27 val=$1 28 echo -e "\033[34m ${val} \033[0m" 29} 30 31PURPLE(){ 32 val=$1 33 echo -e "\033[35m ${val} \033[0m" 34} 35 36DARKGREEN(){ 37 val=$1 38 echo -e "\033[36m ${val} \033[0m" 39} 40 41########################################################### 42#登录交互操作 43commd(){ 44ssh -o "StrictHostKeyChecking no" $IP "$cmd" < /dev/null 45} 46 47########################################################### 48#服务资源参数加载 49 50eval $(/bin/grep disksize gather.conf) 51eval $(/bin/grep cpusize gather.conf) 52eval $(/bin/grep memsize gather.conf) 53eval $(/bin/grep swapsize gather.conf) 54eval $(/bin/grep dropsize gather.conf) 55eval $(/bin/grep ntpsize gather.conf) 56 57eval $(/bin/grep vss gather.conf) 58eval $(/bin/grep vss_ip gather.conf) 59eval $(/bin/grep ntp1_server_ip gather.conf) 60eval $(/bin/grep ntp1_client gather.conf) 61eval $(/bin/grep ntp2_server_ip gather.conf) 62eval $(/bin/grep ntp2_client gather.conf) 63eval $(/bin/grep sarip gather.conf) 64eval $(/bin/grep mass gather.conf) 65eval $(/bin/grep ipvsadm gather.conf) 66eval $(/bin/grep losssize gather.conf) 67 68eval $(/bin/grep bo gather.conf) 69eval $(/bin/grep bo_ip gather.conf) 70eval $(/bin/grep cdn gather.conf) 71eval $(/bin/grep cdn_ip gather.conf) 72eval $(/bin/grep VSS gather.conf) 73eval $(/bin/grep VSS_IP gather.conf) 74eval $(/bin/grep lvs gather.conf) 75eval $(/bin/grep lvs_ip gather.conf) 76eval $(/bin/grep portal gather.conf) 77eval $(/bin/grep portal_ip gather.conf) 78########################################################## 79 80 81 82DISK(){ 83 cmd='df -h' 84 disk=`commd $IP $cmd |awk '{if (NF==6){print $5","$6}else if (NF==5){print $4","$5}}'|grep -v -E "已用%|挂载点|shm|boot"` 85 for data in $disk 86 do 87 valnum=`echo $data|awk -F[,%] '{print $1}'` 88 diskname=`echo $data|awk -F[,%] '{print $3}'` 89 if [ $valnum -gt $disksize ] ;then 90 RED "($diskname),$valnum%" 91 else 92 echo "($diskname),$valnum%" 93 fi 94 done 95} 96CPU(){ 97 cmd='top -b n 1' 98 CPUVAL=`commd $IP $cmd|grep "Cpu(s)"|awk -F, '{print $1,$2,$4}'` 99 cpuval=`echo $CPUVAL|awk -F[:%] -v cpusizes=$cpusize '{if($2>cpusizes){print 0}else {print 1}}'` 100 if [ -n "$CPUVAL" ];then 101 if [ $cpuval -eq 0 ];then 102 RED "$CPUVAL" 103 else 104 echo "$CPUVAL" 105 fi 106 fi 107} 108 109 110MEM(){ 111 cmd='free -m' 112 mem=`commd $IP $cmd|grep "Mem"|awk '{sum=$2-$4-$6-$7}END{printf "%d\n", (sum/$2*100)}'` 113 if [ -n "$mem" ];then 114 if [ $mem -gt $memsize ];then 115 RED "MEM: $mem%" 116 else 117 echo "MEM: $mem%" 118 fi 119 fi 120} 121 122SWAP(){ 123 cmd='free -m' 124 swap=`commd $IP $cmd|grep "Swap"|awk '{printf "%d\n",($3/$2)}'` 125 if [ -n "$swap" ];then 126 if [ $swap -gt $swapsize ];then 127 RED "SWAP: $swap%" 128 else 129 echo "SWAP: $swap%" 130 fi 131 fi 132} 133NET(){ 134 cmd="ifconfig|grep -E 'eth|bond'" 135 network=`commd $IP $cmd|grep -E '^eth|^bond'|awk '{print $1}'` 136 for net in $network 137 do 138 net=`echo $net|grep -v ":"` 139 if [ "$net" != "" ];then 140 cmd="ifconfig $net" 141 DROPVAL=`commd $IP $PASSWD $cmd|grep "RX packets"|awk /dropped/'{print $4}'` 142 dropval=`echo $DROPVAL|awk -F: '{print $2}'` 143 cmd="ethtool $net|grep 'Link'" 144 UPDOWN=`commd $IP $PASSWD $cmd|grep 'detected'|awk '{print $NF}'` 145 statval=`echo $UPDOWN|sed 's/\r//g'` 146 if [ "$statval" == "no" ] || [ $dropval -gt $dropsize ] ;then 147 RED "$NAME,$IP,$net,$DROPVAL,$UPDOWN" 148 else 149 echo "$NAME,$IP,$net,$DROPVAL,$UPDOWN" 150 fi 151 fi 152 done 153} 154 155GATH(){ 156for IP in $1 157do 158 NAME=`cat iplist.txt|grep "\<$IP\>"|awk '{print $3}'` 159 sip=`echo $IP|awk -F. '{print $1"."$2"."$3}'` 160 cmd="ip add|grep $sip|awk '{print \$2}'|uniq|wc -l" 161 num=`commd $IP $cmd` 162 NAMES=`echo $NAME|grep 'CDN'` 163 if [ "${NAMES}" != "" ];then 164 if [ $num -ge 4 ]; then 165 for role in $2 166 do 167 cmd="ps uax|grep ngod|grep $role|grep -v 'grep'" 168 val=`commd $IP $cmd|grep "$role"|grep -v "grep"` 169 if [ "$val" == "" ];then 170 RED "$NAME,$IP,$role,进程不存在!" 171 else 172 echo "$NAME,$IP,$role,进程存在!" 173 fi 174 done 175 else 176 for role in $2 177 do 178 roles=`echo $role|grep -E "rti|csi|cls"` 179 if [ "$roles" == "" ] ;then 180 cmd="ps uax|grep ngod|grep $role|grep -v 'grep'" 181 val=`commd $IP $cmd|grep "$role"|grep -v "grep"` 182 if [ "$val" == "" ];then 183 RED "$NAME,$IP,$role,进程不存在!" 184 else 185 echo "$NAME,$IP,$role,进程存在!" 186 fi 187 fi 188 done 189 fi 190 else 191 if [ $num -ge 2 ]; then 192 for role in $2 193 do 194 cmd="ps uax|grep $role|grep -v 'grep'" 195 val=`commd $IP $cmd|grep "?"` 196 if [ "$val" == "" ];then 197 RED "$NAME,$IP,$role,进程不存在!" 198 else 199 echo "$NAME,$IP,$role,进程存在!" 200 fi 201 done 202 else 203 echo "$NAME,$IP,备机器" 204 fi 205 fi 206done 207} 208 209GATHS(){ 210for IP in $1 211do 212 NAME=`cat iplist.txt|grep "\<$IP\>"|awk '{print $3}'` 213 for role in $2 214 do 215 cmd="ps aux|grep ngod|grep $role|grep -v 'grep'" 216 val=`commd $IP $cmd|grep "$role"|grep -v "grep"` 217 if [ "$val" == "" ];then 218 echo "$NAME,$IP,$role,进程不存在!" 219 else 220 echo "$NAME,$IP,$role,进程存在!" 221 fi 222 done 223done 224} 225 226NTP(){ 227 ntp1(){ 228 if [ "$ntp1_server_ip" != "" ] && [ "$ntp1_client" != "" ] ;then 229 for IP in ${ntp1_client[@]} 230 do 231 NAME=`cat iplist.txt|grep "\<$IP\>"|awk '{print $3}'` 232 cmd="ntpdate -u ${ntp1_server_ip}" 233 ntpval=`commd $IP $cmd|awk /offset/'{print $10}'` 234 ntpnum=`echo $ntpval|awk -v ntpsizes=$ntpsize '{if ($1>ntpsizes){print 0}else {print 1}}'` 235 if [ $ntpnum -eq 0 ] ;then 236 RED "$NAME,$IP,$ntpval" 237 else 238 echo "$NAME,$IP,$ntpval" 239 fi 240 done 241 fi 242 } 243 ntp2(){ 244 if [ "$ntp2_server_ip" != "" ] && [ "$ntp2_client" != "" ] ;then 245 for IP in ${ntp2_client[@]} 246 do 247 NAME=`cat iplist.txt|grep "\<$IP\>"|awk '{print $3}'` 248 cmd="ntpdate -u ${ntp2_server_ip}" 249 ntpval=`commd $IP $cmd|awk /offset/'{print $10}'` 250 ntpnum=`echo $ntpva2|awk -v ntpsizes=$ntpsize '{if ($1>ntpsizes){print 0}else {print 1}}'` 251 if [ $ntpnum -eq 0 ] ;then 252 RED "$NAME,$IP,$ntpval" 253 else 254 echo "$NAME,$IP,$ntpval" 255 fi 256 done 257 fi 258} 259ntp2 260ntp1 261} 262 263PING(){ 264 network(){ 265 cmd="ping -I $1 -c 5 $2" 266 loss=`commd $IP $cmd|grep " packets"|awk '{print $6}'` 267 lossval=`echo $loss|awk -F% '{print $1}'` 268 if [ $lossval -gt $losssize ] ;then 269 RED "$NAME,$IP,$1,$loss" 270 else 271 echo "$NAME,$IP,$1,$loss" 272 fi 273 } 274 cat iplist.txt|grep -v "\#" |while read file 275 do 276 IP=`echo $file|awk '{print $1}'` 277 NAME=`echo $file|awk '{print $3}'` 278 cmd='route -n|grep -E "bond1|bond0"' 279 val=`commd $IP $cmd|grep "\<UG\>"|awk '{print $2,$NF}'|sort|uniq` 280 net_num=`echo $val|awk '{print NF}'` 281 if [ $net_num -eq 2 ];then 282 gw=`echo $val|awk '{print $1}'` 283 netname=`echo $val|awk '{print $2}'` 284 network $netname $gw 285 elif [ $net_num -eq 4 ] ; then 286 gw1=`echo $val|awk '{print $1}'` 287 gw2=`echo $val|awk '{print $3}'` 288 netname1=`echo $val|awk '{print $2}'` 289 netname2=`echo $val|awk '{print $4}'` 290 network $netname1 $gw1 291 network $netname2 $gw2 292 fi 293 done 294 295} 296 297SAR(){ 298 299 if [ "$sarip" != "" ];then 300 sar(){ 301 NAME=`cat iplist.txt|grep "\<$IP\>"|awk '{print $3}'` 302 cmd="export LANG=zh_CN.UTF-8;sar -n DEV 2 2" 303 GREEN "*********************************${NAME},${IP}*******************************************" 304 commd $IP $cmd|grep -E "平均时间:|Average" 305 } 306 for IP in ${sarip[@]} 307 do 308 sar 309 done 310 fi 311} 312MASS(){ 313 314 if [ "$mass" != "" ];then 315 Date=`date +%Y-%m-%d_%H-%M-%S` 316 ipfile='disk_mass.csv' 317 WGET() 318 { 319 wget -O diskstatus.xml "http://${ip}:${port}/cmd?cmdname=GetSysInfo" >/dev/null 2>&1 320 } 321 echo "AREA,IPADDR,MASSSTATUS" 322 for serverinfo in `cat ${ipfile}|grep "$mass"` 323 do 324 area=`echo ${serverinfo}|cut -d, -f1` 325 ip=`echo ${serverinfo}|cut -d, -f2` 326 port=`echo ${serverinfo}|cut -d, -f3` 327 if ( ping -c 1 $ip >/dev/null );then 328 WGET 329 if [ `grep -c ok diskstatus.xml` -eq 1 ];then 330 allsize=`awk -F "<SysAllSize>" '{print $2}' diskstatus.xml |awk -F "</" '{print $1}'` 331 usesize=`awk -F "<SysUsedSize>" '{print $2}' diskstatus.xml |awk -F "</" '{print $1}'` 332 stat='ok' 333 let per=usesize*100/allsize 334 else 335 stat='bad' 336 fi 337 else 338 stat='bad' 339 fi 340 if [ "$stat" = "ok" ];then 341 echo "${area},${ip},${per}%" 342 elif [ "$stat" = "bad" ] ;then 343 RED "${area},${ip},error" 344 fi 345 done 346 rm -rf diskstatus.xml 347 fi 348} 349 350IPVSADM(){ 351 if [ "$ipvsadm" != "" ];then 352 for IP in ${ipvsadm[@]} 353 do 354 NAME=`cat iplist.txt|grep "\<$IP\>"|awk '{print $3}'` 355 sip=`echo $IP|awk -F. '{print $1"."$2"."$3}'` 356 cmd="ip add|grep -c $sip" 357 num=`commd $IP $cmd` 358 if [ $num -gt 1 ];then 359 cmd='ipvsadm -ln' 360 GREEN "*********************************${NAME},${IP}************************************" 361 commd $IP $cmd|grep "Route" 362 else 363 cmd='/etc/init.d/keepalived status' 364 BLUE "**********************************${NAME},${IP}************************************" 365 commd $IP $cmd|grep "keepalived" 366 fi 367 done 368 fi 369 370} 371 372main(){ 373RED "####IP#########|################CPU#############|##MEM#####|####SWAP###|########################DISK###############################" 374cat iplist.txt|grep -v "\#"|while read file 375do 376 IP=`echo $file|awk '{print $1}'` 377 NAME=`echo $file|awk '{print $3}'` 378 disk=`DISK|xargs` 379 cpu=`CPU` 380 mem=`MEM` 381 swa=`SWAP` 382 echo "$NAME,$IP:| $cpu | $mem | $swa | DISK:$disk" 383done 384} 385 386WNETS(){ 387cat iplist.txt|grep -v "#"|while read file 388do 389 IP=`echo $file|awk '{print $1}'` 390 NAME=`echo $file|awk '{print $3}'` 391 NET 392done 393} 394 395ips=${vss_ip[@]};gath=${vss[@]} 396bos=${bo[@]};bo_ips=${bo_ip[@]} 397cdns=${cdn[@]};cdn_ips=${cdn_ip[@]} 398VSSS=${VSS[@]};VSS_IPS=${VSS_IP[@]} 399lvss=${lvs[@]};lvs_ips=${lvs_ip[@]} 400portals=${portal[@]};portal_ips=${portal_ip[@]} 401 402#RED GREEN YELLOW BLUE PURPLE DARKGREEN 403 404Usage(){ 405 echo """$0 406 -h help. 407 -z cpu,mem,swap... 408 -n ntp 409 -p ping 410 -s sar -n DEV 2 2 411 -m MASS 412 -i IPVSADM 413 -w NETWORK 414 -j 程序进程 415 -a 以上所有的。""" 416} 417if [ $# -eq 0 ];then 418 Usage 419fi 420while getopts ":h",":znpsmiwja" opt 421do 422 case $opt in 423 "h") 424 Usage 425 exit -1 426 ;; 427 "z") 428 main 429 #TIME 430 ;; 431 "n") 432 NTP 433 ;; 434 "p") 435 PING 436 ;; 437 "s") 438 SAR 439 ;; 440 "m") 441 MASS 442 ;; 443 "i") 444 IPVSADM 445 ;; 446 "w") 447 WNETS 448 ;; 449 "j") 450 GATH "$ips" "$gath" 451 GATHS "$bo_ips" "$bos" 452 GATH "$cdn_ips" "$cdns" 453 GATHS "$VSS_IPS" "$VSSS" 454 GATH "$lvs_ips" "$lvss" 455 GATHS "$portal_ips" "$portals" 456 ;; 457 "a") 458 main 459 #TIME 460 GREEN "NTP******************************************************************************" 461 NTP 462 YELLOW "PINT******************************************************************************" 463 PING 464 SAR 465 PURPLE "MASS******************************************************************************" 466 MASS 467 IPVSADM 468 DARKGREEN "NETWORK******************************************************************************" 469 WNETS 470 YELLOW "程序进程******************************************************************************" 471 GATH "$ips" "$gath" 472 GATHS "$bo_ips" "$bos" 473 GATH "$cdn_ips" "$cdns" 474 GATHS "$VSS_IPS" "$VSSS" 475 GATH "$lvs_ips" "$lvss" 476 GATHS "$portal_ips" "$portals" 477 ;; 478 *) 479 echo "请输入参数" 480 exit -1 481 ;; 482 esac 483done