shell脚本报错{"errcode":40035,"errmsg":"缺少参数 json"}

Posted IT界的小十七

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本报错{"errcode":40035,"errmsg":"缺少参数 json"}相关的知识,希望对你有一定的参考价值。

今天用shell写了一个钉钉告警,但是在通过发送信息的那一步,产生一个报错:{"errcode":40035,"errmsg":"缺少参数 json"}。下面是详细的shell脚本和报警信息

#!/bin/bash
source ~/.bash_profile
time=$(date "+%Y-%m-%d %H:%M:%S")
webhook=\'https://oapi.dingtalk.com/robot/send?access_token=efca4349w23b9488aa48f97a14194996e7eb61cbfa51d57a31dffa874e5b1ce2\'
HOSTNAME="10.27.228.11"    #数据库主机IP
PORT="3306"     #端口号
USERNAME="root"     #用户名
PASSWORD="paopao1818.cn"        #密码 (如mysql>5.6会提示密码安全问题,可以正常执行脚本,可以在my.cnf文件中的 [client]  下面加入password   = YourPassword,然后注释本行即可,意思为将密码写到配置文件中,不在shell中明文)

DBNAME="airflow_old"   #数据库名称
TABLENAME="import_error"   #数据库中表的名称

function SendMsgToDingding() {
    curl $webhook -H \'Content-Type: application/json\' -d "
    {
        \'msgtype\': \'text\',
        \'text\': {
                     \'content\': \'
    标题:airfow
    时间:$time
    告警信息:[${stacktrace}]
    报错脚本:[${filename}]
    请马上处理!!!\'            
      },
        \'at\': {
            \'isAtAll\': true
        }
    }"
}


select_sql="select CONCAT_WS(\'-\',filename,stacktrace,\'$\') as rows from ${TABLENAME}" 
result=`mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}" | awk \'NR>1\'`       #执行sql(如将密码写入my.cnf中,删除 -p${PASSWORD} 即可,因为默认使用了密码。如此方法行不通,直接  result=`mysql -h${HOSTNAME} -P${PORT} -u${USERNAME} -proot ${DBNAME} -e "${select_sql}" | awk \'NR>1\'`)
arr=$(echo $result|tr -d "\\n\\t")       # 查询到结果去除特殊符号,

echo $arr>arr.log

/bin/rm -rf /home/admin/software/test/mysql.txt
touch /home/admin/software/test/mysql.txt
echo $result>result.log
for s in ${arr[@]}                           # 遍历数组,写入hosts文件,根据是否含有逗号做不同处理
do  
   echo ${s}>>s.log
    [[ $s =~ "$" ]] && echo -ne ${s} |grep -v \'$\'"/n" >> /home/admin/software/test/mysql.txt
    [[ $s =~ "$" ]] || echo -ne ${s}" "  >> /home/admin/software/test/mysql.txt
done
count=`wc -w mysql.txt|awk -F " " \'{print $1}\'`
count1=`wc -l mysql.txt|awk -F " " \'{print $1}\'`
echo $count
if [ ${count} -eq 0 ] ; 
then
echo $date"代码运行正常">>date.log
else
cat mysql.txt|sed  $\'s/\\\'//g\' | while read line
do
echo "i的值是:"$i
time=$time
filename=`echo ${line}|awk -F\'-\' \'{print $1}\'`
echo "报错文件" $filename
stacktrace=`echo ${line}|awk -F\'-\' \'{print $2}\'`
echo "报错内容" $stacktrace
SendMsgToDingding
done
fi

当表中的数据import_error是这种状态的时候,

/home/admin/program/airflow/dags/python/dag/openwork/jobchain/dep_day_84.py (_mysql_exceptions.OperationalError) (1040, \'Too many connections\')

 

就会报{"errcode":40035,"errmsg":"缺少参数 json"}这错误,我上午搜了一下,有其中一篇文章跟我是同样的问题,他的报错原因是出现了空格,然后我也手动去除空格后哈市报这个错,然后我猜测是特殊字符的问题,而这段内容中我把括号,空格,点还有单引号全试了一遍,最终发现是单引号的问题,那么我就在

cat mysql.txt|sed  $\'s/\\\'//g\' | while read line这一步中加了|sed  $\'s/\\\'//g\' ,去除单引号,刚刚开始加的时候,是sed -i $\'s/\\\'//g\' 这个样子,
但是会报错sed: no input files,通过查看才知道不能加i

 

 

 最终去除单引号以后,shell报警能正常发送了。

 

告警效果图:
标题:airfow
时间:2020-05-07 17:13:44
告警信息:[(_mysql_exceptions.OperationalError) (1040, Too many connections)]
报错脚本:[/home/admin/program/airflow/dags/python/dag/openwork/jobchain/dep_day_84.py]
请马上处理!!!@所有人

以上是关于shell脚本报错{"errcode":40035,"errmsg":"缺少参数 json"}的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本菜单

shell脚本报错:"[: =: unary operator expected"

Linux Shell脚本报错:command not found

求助shell脚本修改xml的值

linux shell脚本 总报错sh11-2.sh: 9: Syntax error: "(" unexpected

jenkins执行groovy 脚本报错