IT运维笔记


使用shell脚本检测并下发告警短信

#!/bin/sh
#在crontab中运行时需要先使用source获取oracle用户环境变量
source /home/oracle/.bash_profile

#为了少打点字,变更当前目录到脚本所在目录,生成的文件直接放在当前目录即可
cd /home/oracle/autocheck/
rm -rf *.csv

#生成check使用的sql脚本,以下为相关参数
echo 'set echo off;'>checktb.sql
echo 'set feedback off;'>>checktb.sql
echo 'set trimspool on;'>>checktb.sql
echo 'set trimout on;'>>checktb.sql
echo 'set linesize 1200;'>>checktb.sql
echo 'set pagesize 2000;'>>checktb.sql
echo 'set newpage 1;'>>checktb.sql
echo 'set heading on;'>>checktb.sql
echo 'set term off;'>>checktb.sql
echo 'set termout off;'>>checktb.sql
echo 'set timing off;'>>checktb.sql

#使用spool将查询结果输出到指定文件
echo 'spool checktb.csv'>>checktb.sql

#查询语句,使用`date +"%"`获取日期参数
echo "select to_char(sysdate-1/96,'yyyy mm-dd hh24:mi') starttime,to_char(sysdate,'hh24:mi') checktime,accountid,count(*) tjs,">>checktb.sql
echo "sum(case when status is not null then 1 else 0 end) tbcgs,round(sum(case when status is not null then 1 else 0 end)/count(*)*100) tbcgl">>checktb.sql
echo "from  (select receivetime,msgid,accountid from t_SOURCE_MSG_`date +"%y"``date +"%m"`">>checktb.sql
echo "where  receivetime > to_char(sysdate-1/96,'yyyy-mm-dd hh24:mi:ss')) t">>checktb.sql
echo "left join (select distinct localmsgid,status from  t_sms_status_sync_`date +"%y"``date +"%m"` where routerstatus=1 and">>checktb.sql
echo "synctime like to_char(sysdate-1/96,'yyyy-mm-dd')||'%') r">>checktb.sql
echo "on r.localmsgid=t.msgid ">>checktb.sql
echo "group by accountid HAVING round(sum(case when status is not null then 1 else 0 end)/count(*)*100)<80;">>checktb.sql

#结束导出
echo "spool off">>checktb.sql

#退出sqlplus
echo "exit">>checktb.sql

#使用sqlplus运行生成的sql脚本
sqlplus test/"""test""" @checktb.sql

#将查询到的结果进行二次处理,生成单独的告警内容文件
cat checktb.csv|grep "20">tbend.csv
cat tbend.csv |while read line; do echo $line|awk '{print "【云平台】"$2" "$3"-"$4"同步状态告警\n----------"}'>mstb.csv;done
cat tbend.csv |while read line; do echo $line|awk '{printf $5"提交:"$6",""成功:"$7",同步成功率:"$8"%\n"}'>>mstb.csv;done

#检测是否存在告警内容文件,并调用短信接口下发告警短信,mobile.txt中为接收告警号码列表
if [ -f mstb.csv ]; then
    for line in $(cat mobile.txt); do
        curl  --data-urlencode content@mstb.csv "http://192.168.0.32:9112/testhttp/sendSms?account=1001&authCode=93597408787A5D252C4C6ADC9791C9&serviceCode=11111&msisdn="$line
    done
fi