一 案例1 通过监控jar包的pid,进行重启
1.1 脚本内容
1.脚本内容:
时刻监控程序的pid,存在则提示正在运行;若不存在则进行重新jar包;并删除大于2天前的日志文件。
#!/bin/bash
source /etc/profile
rdatetime=`date +"%Y-%m-%d %H:%M:%S"`
if [ `ps -ef|grep java|grep idaa-app-analysisSolrHistoryNews|awk '{print $2}'` ]
then
pid=`ps -ef|grep java|grep idaa-app-analysisSolrHistoryNews|awk '{print $2}'`
echo "${rdatetime}:idaa-app-analysisSolrHistoryNews is running...pid:${pid}"
echo "${rdatetime}:idaa-app-analysisSolrHistoryNews is running...pid:${pid}">>/home/new-idaa-analysis/logs/idaa-app-analysisSolrHistoryNews.log
else
cd /home/new-idaa-analysis/idaa-app-analysisSolrHistoryNews/bin
nohup ./startup.sh >/dev/null 2>&1 &
pid=`ps -ef|grep java|grep idaa-app-analysisSolrHistoryNews|awk '{print $2}'`
echo "${rdatetime}:restart idaa-app-analysisSolrHistoryNews is running...pid:${pid}"
echo "${rdatetime}:restart idaa-app-analysisSolrHistoryNews is running...pid:${pid}">>/home/new-idaa-analysis/logs/idaa-app-analysisSolrHistoryNews.log
fi
exec find /home/new-idaa-analysis/logs/ -mtime +2 -type f |xargs rm -f
二 案例2 通过监控jar包的log,进行重启
2.1 脚本内容
1.监控jar包的日志,最新的一条记录;在规定的时间没有新的日志,则杀掉当前程序的pid,然后重启启动,最后并删除掉大于两天前的日志文件。
#!/bin/bash
source /etc/profile
########初始化一些配置#########
logDir=/root/export/servers/jiaoben/logs/gldevicestoptotaltask/gldevicestoptotaltask.log
#单位s
timeRange=30;
APP_NAME=test-jar.jar
APP_DIR=/root/export/servers/jiaoben
APP_CONFIG_FILE=application.yml
MONITOR_DIR=/root/export/servers/jiaoben/jk-logs
#创建监控脚本存储目录
mkdir -p $MONITOR_DIR
jk_log=$MONITOR_DIR"/monitor-shell.log"
#获取日志最新时间
#lastLogTime='2023-01-03 17:35:04.970';
lastLogTime=`tail -n 1 ${logDir} |awk '{print $1,$2}'`
lastLogFormatTime=`date -d "${lastLogTime}" "+%Y-%m-%d %H:%M:%S"`
echo "最新日志时间:" $lastLogFormatTime >> $jk_log
#获取当前时间
currNowTime=`date +"%Y-%m-%d %H:%M:%S"`
echo "当前时间:" $currNowTime >> $jk_log
#计算差值
duration=$(($(date +%s -d "${currNowTime}")-$(date +%s -d "${lastLogFormatTime}")));
echo "时间差:" $duration"s" >> $jk_log
#判断
if [ $duration -gt $timeRange ];
then
echo "时间差大于: "${timeRange}" 判断重启服务....." >> $jk_log
pid=`ps -ef|grep java|grep ${APP_NAME}|awk '{print $2}'`
echo "pid:"${pid} >> $jk_log
#如果存在,kill掉,重启,-z pandu changdu wei 0
if [ -z "${pid}" ]; then
echo ${APP_NAME}" 程序进程号不存在!!!!!" >> $jk_log
else
kill -9 $pid
echo "${APP_NAME} is already shutdown,kill pid :"$pid >> $jk_log
#启动jar包
nohup java -jar -Dfile.encoding=utf-8 -Dspring.config.location=${APP_DIR}/${APP_CONFIG_FILE} ${APP_DIR}/${APP_NAME} > nohup.out 2>&1 &
pid=`ps -ef|grep java|grep ${APP_NAME}|awk '{print $2}'`
rdatetime=`date +"%Y-%m-%d %H:%M:%S"`
echo "${rdatetime}:restart ${APP_NAME} is running...pid:${pid}" >> $jk_log
fi
else
echo "时间差不大于:" ${timeRange} "s, 程序正常,日志正常输出......" >> $jk_log
fi
exec find $MONITOR_DIR"/" -mtime +2 -type f |xargs rm -f
echo "...................................本次分析结束................................." >> $jk_log
说明:一些常见shell脚本见网盘