Linux shell 监控应用存活并发邮件通知


curl需要监控的接口,将结果发送邮件通知,也可以判断REST接口的返回数据内容。
简书地址

需求

  1. 每天执行三次,分别为:7:10,12:10,16:10

  2. 7:10执行日期参数为T-1,12:10,16:10执行日期参数为T(T是指当天)

  3. 每次执行判断一下接口返回的数据量,以邮件形式发送给相关人员

脚本

#!/bin/bash

var1=$1
webUrls=(
"http://sso1169sjdptest.haier.net/fx_app/common/inter?fresh=1&dataType=rrs_fxapp_for_leader¶ms=period_date::${var1}"
"http://sso1169sjdptest.haier.net/fx_app/common/inter?fresh=1&dataType=rrs_fxapp_m_wl_gongm_result_info_view¶ms=period_date::${var1}"
"http://sso1169sjdptest.haier.net/fx_app/common/inter?fresh=1&dataType=rrs_fxapp_m_wl_lianq_result_info_view¶ms=period_date::${var1}"
"http://sso1169sjdptest.haier.net/fx_app/common/inter?fresh=1&dataType=rrs_fxapp_for_soldier_mall_score¶ms=period_date::${var1}"
)
declare -a name

#使用curl命令检查http服务器的状态
#-m设置curl不管访问成功或失败,最大消耗的时间为5秒,5秒连接服未响应则视为无法连接
#-s设置静默连接,不显示连接时的连接速度、时间消耗等信息
#-o将curl下载的页面内容导出到/dev/null(默认会在屏幕显示页面内容)
#-w设置curl命令需要显示的内容%{http_code},指定curl返回服务器的状态码
# 如果不是看结果,是看http状态的话使用如下函数
check_http(){
    status_code=$(curl -m 5 -s-o /dev/null -w %{http_code} https://www.baidu.com)
}

function httpRequest()
{
    echo  "日期参数:${var1}"
    for ((i=0; i<${#webUrls[@]}; i++))
    do
        echo "顺序:${i},请求:${webUrls[i]}"
        res=$(curl -m 5 -s ${webUrls[i]} | jq '.data' | jq 'length')
        name[$i]=$res
        echo ${name[$i]} #为方便检查,加了打印
    done

}

httpRequest "$@"

emailContent="链接数据接口:${name[0]}      中心数据接口:${name[1]}      链群数据接口:${name[2]}     评分数据接口:${name[3]}"

echo "${emailContent}" | mail -s '4个指标接口当前的数据通知' marvin.ma@redcreation.net,zhangsan@163.com

收到的邮件:

email

知识储备

获取当前时间:

time=$(date "+%Y%m%d-%H%M%S")
time2=$(date "+%Y-%m-%d %H:%M:%S")
echo "${time}"

昨天:

echo $(date +"%Y-%m-%d" -d "-1day")

其他参考:shell date 获取昨天日期

curl 到json内容:

#使用curl命令检查http服务器的状态
#-m设置curl不管访问成功或失败,最大消耗的时间为5秒,5秒连接服未响应则视为无法连接
#-s设置静默连接,不显示连接时的连接速度、时间消耗等信息
#-o将curl下载的页面内容导出到/dev/null(默认会在屏幕显示页面内容)
#-w设置curl命令需要显示的内容%{http_code},指定curl返回服务器的状态码
res=$(curl  -s "https://www.baidu.com")
echo  $res

接收参数:

#!/bin/bash
# 必须写绝对路径,不然crontab不执行,因为找不到路径
log=/opt/jc/task.log
var1=$1
test()
{
    time=$(date "+%Y-%m-%d %H:%M:%S")
    echo "${time} do something, set var1 = ${var1}" >> $log
}
test

测试定时任务

vi /etc/crontab

添加一行,每2分钟执行一次

*/2 * * * * root /opt/jc/curl.sh hahaha

为了完成这个需求,我的crontab的内容如下

10 7 * * * root /opt/jc/curl.sh $(date +"%Y%m%d" -d "-1day")
10 12,16 * * * root /opt/jc/curl.sh $(date "+%Y%m%d")

shell处理json数据工具—–jq

获取接口返回的数据中data的值数组大小

res=$(curl -m 5 -s ${webUrls[i]}  |  jq '.data'  |  jq 'length')

其他jq的用法参考:shell脚本处理JSON数据工具jq

遇到的问题

  1. 脚本不执行不知道为啥
    方案:先用如下命令看看crontab服务是否正常,不正常的进行安装。

    service crond status
    

    没有安装的话先安装。

  2. 定时任务出错
    出错的情况会有邮件通知,位置在/var/mail/root中,可以查看脚本执行失败的原因

  3. Shell 脚本时显示declare not found的问题
    ubuntu系统将默认的bash换成了dash,需要手动替换下,参考下面的参考链接Shell 脚本时显示declare not found的问题配置。

shell里发送邮件

使用sendmail工具发送邮件。
Shell 脚本时显示declare not found的问题


评论
  目录