curl需要监控的接口,将结果发送邮件通知,也可以判断REST接口的返回数据内容。
简书地址
需求
每天执行三次,分别为:7:10,12:10,16:10
7:10执行日期参数为T-1,12:10,16:10执行日期参数为T(T是指当天)
每次执行判断一下接口返回的数据量,以邮件形式发送给相关人员
脚本
#!/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
收到的邮件:
知识储备
获取当前时间:
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
遇到的问题
脚本不执行不知道为啥
方案:先用如下命令看看crontab服务是否正常,不正常的进行安装。service crond status
没有安装的话先安装。
定时任务出错
出错的情况会有邮件通知,位置在/var/mail/root
中,可以查看脚本执行失败的原因Shell 脚本时显示declare not found的问题
ubuntu系统将默认的bash换成了dash,需要手动替换下,参考下面的参考链接Shell 脚本时显示declare not found的问题配置。