shell脚本专题(08):让脚本更优雅--循环

2023-09-09 16:21:41 浏览数 (2)

前言:最近生产上业务卡顿,怀疑是程序连数据库有问题,现需要部署监控,获取各服务与数据库的连接数,输出格式为key:vaule。

一、传统模式
代码语言:javascript复制
#!/bin/bash

XDB1=10.11.11.116
XDB2=10.11.11.117

FLOW_PS=`ps -ef|grep flow|grep -v grep|awk {'print $2'}`
OUT_PS=`ps -ef|grep out|grep -v grep|awk {'print $2'}`
SETT_PS=`ps -ef|grep sett|grep -v grep|awk {'print $2'}`
TASK_PS=`ps -ef|grep task|grep -v grep|awk {'print $2'}`
WEB_PS=`ps -ef|grep web|grep -v grep|awk {'print $2'}`
TOM_PS=`ps -ef|grep apache-tomcat|grep -v grep|awk {'print $2'}`

FLOW_CNT116=`netstat -anlp|grep ESTABLISHED|grep $XDB1|grep $FLOW_PS|wc -l`
FLOW_CNT117=`netstat -anlp|grep ESTABLISHED|grep $XDB2|grep $FLOW_PS|wc -l`

OUT_CNT116=`netstat -anlp|grep ESTABLISHED|grep $XDB1|grep $OUT_PS|wc -l`
OUT_CNT117=`netstat -anlp|grep ESTABLISHED|grep $XDB2|grep $OUT_PS|wc -l`

SETT_CNT116=`netstat -anlp|grep ESTABLISHED|grep $XDB1|grep $SETT_PS|wc -l`
SETT_CNT117=`netstat -anlp|grep ESTABLISHED|grep $XDB2|grep $SETT_PS|wc -l`

TASK_CNT116=`netstat -anlp|grep ESTABLISHED|grep $XDB1|grep $TASK_PS|wc -l`
TASK_CNT117=`netstat -anlp|grep ESTABLISHED|grep $XDB2|grep $TASK_PS|wc -l`

WEB_CNT116=`netstat -anlp|grep ESTABLISHED|grep $XDB1|grep $WEB_PS|wc -l`
WEB_CNT117=`netstat -anlp|grep ESTABLISHED|grep $XDB2|grep $WEB_PS|wc -l`

TOM_CNT116=`netstat -anlp|grep ESTABLISHED|grep $XDB1|grep $TOM_PS|wc -l`
TOM_CNT117=`netstat -anlp|grep ESTABLISHED|grep $XDB2|grep $TOM_PS|wc -l`

echo "flow116:$FLOW_CNT116"
echo "flow117:$FLOW_CNT117"

echo "out116:$OUT_CNT116"
echo "out117:$OUT_CNT117"

echo "sett116:$SETT_CNT116"
echo "sett117:$SETT_CNT117"

echo "task116:$TASK_CNT116"
echo "task117:$TASK_CNT117"

echo "web116:$WEB_CNT116"
echo "web117:$WEB_CNT117"

echo "apache-tomcat116:$TOM_CNT116"
echo "apache-tomcat117:$TOM_CNT117"

一共6个服务,2个数据库,输出为“服务名” “数据库标签” “连接数”

运行结果:

二、循环
代码语言:javascript复制
#!/bin/bash

xdb="10.11.11.116 10.11.11.117"

for ps in flow  out sett task web apache-tomcat
do 
  num=`ps -ef|grep $ps|grep -v grep|awk {'print $2'}`
  for db in $xdb
  do
    cnt=`netstat -anlp|grep ESTABLISHED|grep $db|grep $num|wc -l`
    tip=`echo $db|cut -d . -f 4` 
    echo "${ps}${tip}:${cnt}"
  done
done

进程名为第一个循环,数据库名为第二个循环,tip用来区分不同数据库

运行结果:

三、总结

两种不通的方式可以得到相同的结果。传统方式直接明了、通俗易懂,但是略显臃肿;对比之下循环方式简洁优雅。

更多请点击: shell专题

0 人点赞