**功能点:
- 自动创建日志目录和文件
- 在需要生成日志的shell中添加
- 自动删除时间较长的日志文件
- 生成日志目录级别和源代码目录级别一致**
- 传入参数不限
- 具体使用方法和bash/sh 相似
#! /bin/bash -x
function sskj_bash (){
echo "输入参数个数是:$#"
echo "输入的参数是:$@"
PRJ_NAME="/wmt-data" #项目工程名
JOB_NAME=`basename $0 .sh`
curr_date=`date +%Y%m%d`
curr_time=`date +%H%M%S`
if [ $# -eq 0 ];then #判断参数个数是不是为0
echo "参数异常,须输入需要执行的shell以及需要的参数,执行方式:sskj_bash "'${CURR_DIR}'"/test2.sh "'$start_date'" "'$end_date'""
else
tt="${@: -1}"
if [ "${tt}" = "&" ];then #判断尾参是不是&
if [ $# -eq 1 ];then #判断尾参是&并且个数为1
echo "不能只输入&,请输入其他有效参数"
else
declare -r CURR_DIR=$(cd `dirname $0`;pwd)
echo "参数个数为:$#,且最后一个参数是&"
# ${file#*/}:删掉第一个 / 及其左边的字符串
TASK_NAME=$1
# TASK_NAME=${TASK_NAME##*/}
TASK_DIR=${TASK_NAME#*${CURR_DIR}/}
TASK_DIR=${TASK_DIR%.*}
echo "**********TASK_DIR:$TASK_DIR"
# ${file##*/}:删掉最后一个 / 及其左边的字符串
TASK_NAME=${TASK_NAME##*/}
TASK_NAME=${TASK_NAME%.*}
echo "**********TASK_NAME:$TASK_NAME"
# 日志存放目录
# ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
FILE_DIR=${CURR_DIR#*$PRJ_NAME}
LOG_DIR=${CURR_DIR%$PRJ_NAME*}$PRJ_NAME"-logs"${FILE_DIR}/${TASK_DIR}
if [ ! -d "${LOG_DIR}" ]; then
echo "LOG_DIR==="$LOG_DIR
echo "mkdir -p ${LOG_DIR}"
mkdir -p "${LOG_DIR}"
echo "创建日志根目录完成"
fi
logdir="${LOG_DIR}"
#logdir="${LOG_DIR}"
if [ ! -d "${logdir}" ]; then
mkdir -p $logdir
fi
logfile="${TASK_NAME}_${curr_date}.log"
filepath="${logdir}/${logfile}"
file_bak="${filepath}_bak_${curr_date}_${curr_time}"
if [ -f "${filepath}" ]; then
mv $filepath $file_bak
fi
>${logdir}/${logfile}
## 删除日志目录下30天前的日志文件
find ${logdir} -type f -mtime +30 -exec rm -rf {} \;
#加入输入3个参数
cn_t=1
para_args=""
for element in "$@";{
if [ $cn_t -lt $# ];then
if [ $cn_t -eq 1 ] ;then
para_args="$para_args"$element
let cn_t+=1
else
para_args="$para_args "$element
let cn_t+=1
fi
fi
}
echo "*******nohup bash $para_args >> $filepath 2>&1 &*******"
start_dt=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date="$start_dt" +%s)
nohup bash $para_args >> $filepath 2>&1 &
wait
end_dt=`date +'%Y-%m-%d %H:%M:%S'`
end_seconds=$(date --date="$end_dt" +%s);
echo "任务开始时间:${start_dt}">>$filepath
echo "任务结束时间:${end_dt}">>$filepath
echo "任务执行时间:"$((end_seconds-start_seconds))"s">>$filepath
fi
else
echo "有效参数个数为:$#"
declare -r CURR_DIR=$(cd `dirname $0`;pwd)
# ${file#*/}:删掉第一个 / 及其左边的字符串
TASK_NAME=$1
# TASK_NAME=${TASK_NAME##*/}
TASK_DIR=${TASK_NAME#*${CURR_DIR}/}
TASK_DIR=${TASK_DIR%.*}
echo "**********TASK_DIR:$TASK_DIR"
# ${file##*/}:删掉最后一个 / 及其左边的字符串
TASK_NAME=${TASK_NAME##*/}
TASK_NAME=${TASK_NAME%.*}
echo "**********TASK_NAME:$TASK_NAME"
# 日志存放目录
FILE_DIR=${CURR_DIR#*$PRJ_NAME}
LOG_DIR=${CURR_DIR%$PRJ_NAME*}$PRJ_NAME"-logs"${FILE_DIR}/${TASK_DIR}
if [ ! -d "${LOG_DIR}" ]; then
echo "LOG_DIR==="$LOG_DIR
echo "mkdir -p ${LOG_DIR}"
mkdir -p "${LOG_DIR}"
echo "创建日志根目录完成"
fi
logdir="${LOG_DIR}"
#logdir="${LOG_DIR}"
if [ ! -d "${logdir}" ]; then
mkdir -p $logdir
fi
logfile="${TASK_NAME}_${curr_date}.log"
filepath="${logdir}/${logfile}"
file_bak="${filepath}_bak_${curr_date}_${curr_time}"
if [ -f "${filepath}" ]; then
mv $filepath $file_bak
fi
>${logdir}/${logfile}
## 删除日志目录下30天前的日志文件
find ${logdir} -type f -mtime +30 -exec rm -rf {} \;
cn_t=1
para_args=""
for element in "$@";{
if [ $cn_t -eq 1 ] ;then
para_args="$para_args"$element
let cn_t+=1
else
para_args="$para_args "$element
let cn_t+=1
fi
}
echo "*******nohup bash $para_args >> $filepath 2>&1*******"
start_dt=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date="$start_dt" +%s)
nohup bash $para_args >> $filepath 2>&1
wait
end_dt=`date +'%Y-%m-%d %H:%M:%S'`
end_seconds=$(date --date="$end_dt" +%s);
echo "任务开始时间:${start_dt}">>$filepath
echo "任务结束时间:${end_dt}">>$filepath
echo "任务执行时间:"$((end_seconds-start_seconds))"s">>$filepath
fi
fi
}
针对上段生成的 日志,如果有datax,sqoop导出数据的记录:可以查出导出数据量
#! /bin/bash -x
function check_data (){
declare -r CURR_DIR=$(cd `dirname $0`;pwd)
PRJ_NAME="/wmt-data" #项目工程名
JOB_NAME=`basename $0 .sh`
curr_date=`date +%Y%m%d`
curr_time=`date +%H%M%S`
TASK_NAME=$1
# TASK_NAME=${TASK_NAME##*/}
# ${file##*/}:删掉最后一个 / 及其左边的字符串
TASK_DIR=${TASK_NAME#*${CURR_DIR}/}
TASK_DIR=${TASK_DIR%.*}
echo "**********TASK_DIR:$TASK_DIR"
# ${file##*/}:删掉最后一个 / 及其左边的字符串
TASK_NAME=${TASK_NAME##*/}
TASK_NAME=${TASK_NAME%.*}
echo "**********TASK_NAME:$TASK_NAME"
# 日志存放目录
FILE_DIR=${CURR_DIR#*$PRJ_NAME}
# ${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3}
LOG_DIR=${CURR_DIR%$PRJ_NAME*}$PRJ_NAME"-logs"${FILE_DIR}/${TASK_DIR}
logdir="${LOG_DIR}"
logfile="${TASK_NAME}_${curr_date}.log"
filepath="${logdir}/${logfile}"
echo "日志读取目录:$filepath"
group=${2:-"wmt运维"}
num=${3:-"8"}
TASK_NAME=${4:-$TASK_NAME}
tmpfile=`mktemp -t log_XXXX.txt`
cat $filepath | egrep '读出记录总数|读写失败总数|Exported|任务执行时间' > $tmpfile
mached=`cat $tmpfile`
if [ "$mached" != "" ];then
if [[ "$mached" =~ "Exported" ]];then
list=""
while read line
do
list="$list:"$line
done<$tmpfile
echo "list:$list"
finished=`echo $list|awk -F ":" '{print $5}'`
echo $finished
finished=`echo $finished|awk -F " " '{print $2}'`
dt=`echo $list|awk -F ":" '{print $7}'`
echo "finished:$finished"
echo "dt:$dt"
if [ "$finished" = "" ];then
echo "alert_dw -t wework -g "$group" -j "$TASK_NAME" -m '"$TASK_NAME "任务没有找到导出记录数,请查原因~~~' -o "$num""|sh
else
echo "alert_dw -t wework -g "$group" -j "$TASK_NAME" -m '"$TASK_NAME "任务导出成功,共有"${finished}"条记录,本次任务用时"${dt}"' -o "$num""|sh
fi
else
list=""
while read line
do
list="$list:"$line
done<$tmpfile
finished=`echo $list|awk -F ":" '{print $3}'`
errored=`echo $list|awk -F ":" '{print $5}'`
if [ "$finished" = "" ];then
echo "alert_dw -t wework -g "$group" -j "$TASK_NAME" -m '"$TASK_NAME "任务没有找到导出记录数,请查原因~~~' -o "$num""|sh
else
echo "alert_dw -t wework -g "$group" -j "$TASK_NAME" -m '"$TASK_NAME "任务导出成功, 共有成功"${finished}"条记录,失败"${errored}"条记录' -o "$num""|sh
fi
fi
else
echo "没有匹配到相关的日志信息"
fi
}
3.run_hive包装函数
功能描述:
- 根据 shell 路径和参数执行任务
- 如果遇到数据湖的 exception 之类的问题,首先是重跑任务,然后是跑出保存信息到企业微信
#!/bin/bash -x
function run_hive(){
arguments=$*
echo $arguments
job_name=`echo $arguments | sed 's/.*-f\(.*\)\.sql.*/\1/g'`
count=0
# JOB执行失败重试过程,失败一分钟后重试
while [ 0 -eq 0 ]
do
echo ".................. ${job_name##*/} start at `date "+%Y-%m-%d %H:%M:%S" ` ..................."
start_at=`date +'%Y-%m-%d %H:%M:%S'`
hive ${arguments}
if [ $? -eq 0 ]; then
end_at=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date="$start_at" +%s)
end_seconds=$(date --date="$end_at" +%s)
echo "--------------- ${job_name##*/} done at `date "+%Y-%m-%d %H:%M:%S" ` duration: "$((end_seconds-start_seconds))" s ---------------"
break;
else
# 执行失败,重试
count=$[${count}+1]
# 指定重试次数,重试超过3次即失败
if [ ${count} -eq 4 ]; then
exit 10
break
fi
echo "................${job_name##*/} after 60s retry .............."
sleep 480
fi
done
}
# 功能简介: 输出日志到日志路径
# 参数简介:
# $1:调度 shell 文件的路径
# $2:开始时间参数
# $3:结束时间参数
# 使用案例:
# ss_logging /u/users/svccnahahs/prod/wmt-data/src/dwd/dwd_offline '2020-04-01' '2020-04-01'
function ss_logging(){
if [ "$1"=="-h" ]; then
echo "功能简介: 输出日志到日志路径"
echo "参数简介:"
echo " $1:调度 shell 文件的路径"
echo " $2:开始时间参数"
echo " $3:结束时间参数"
echo " 使用案例:"
echo " ss_logging /u/users/svccnahahs/prod/wmt-data/src/dwd/dwd_offline '2020-04-01' '2020-04-01'"
return 0 ;
fi
JOB_PATH=`dirname ${1}`
JOB_NAME=`basename ${1}`
JOB_NAME=${JOB_NAME//.sh/}
curr_date=`date +%Y%m%d`
curr_time=`date +%H%M%S`
start_date=${2}
end_date=${3}
PRJ_NAME="/wmt-data"
LOG_ROOT_DIR=${JOB_PATH%$PRJ_NAME*}$PRJ_NAME"-logs"
if [ ! -d "${LOG_ROOT_DIR}" ]; then
echo "LOG_ROOT_DIR==="$LOG_ROOT_DIR
echo "mkdir -p ${LOG_ROOT_DIR}"
mkdir -p "${LOG_ROOT_DIR}"
echo "创建日志根目录完成"
fi
logdir="${LOG_ROOT_DIR}/${JOB_NAME}"
if [ ! -d "${logdir}" ]; then
mkdir -p $logdir
fi
logfile="${JOB_NAME}_${curr_date}.log"
filepath="${logdir}/${logfile}"
file_bak="${filepath}_bak_${curr_date}_${curr_time}"
if [ -f "${filepath}" ]; then
mv $filepath $file_bak
fi
## 删除日志目录下60天前的日志文件
find ${logdir} -type f -mtime +90 -exec rm -rf {} \;
bash -x ${JOB_PATH}/${JOB_NAME#*cron_}.sh ${start_date} ${end_date} >> $filepath 2>&1 &
}