一、场景
当后台使用springboot方式开发,然后打包成jar包,使用java -jar 命令部署时,需要保留日志信息,并且随着时间的增长日志不能过大,需要进行分割处理,
当然日志总量也有限制,需要定期清除。
二、解决方法
在脚本中使用命令行在后台运行jar, 然后将输出重定向到文件中。使用定时任务,每天在固定时间进行日志转移分割,并且检测清除超过时间范围的日志文件。
启动jar
#!/bin/bash
#jar名称
JAR_NAME=blade_apppack.jar
LOG_PATH=service.log
tips() {
echo ""
echo "WARNING!!!......Tips, please use command: sh auto_service.sh [start|stop|restart|status]. For example: sh auto_service.sh start "
echo ""
exit 1
}
start() {
# 重新获取一下pid,因为其它操作如stop会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid为空时执行
if [ -z $pid ]; then
nohup java -jar /Users/xxx/PackOnline/backEndDeploy/$JAR_NAME > /Users/xxx/PackOnline/backEndDeploy/backEndLog/$LOG_PATH 2>&1 &
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
echo ""
echo "Service ${JAR_NAME} is starting!pid=${pid}"
echo "........................Start successfully!........................."
else
echo ""
echo "Service ${JAR_NAME} is already running,it's pid = ${pid}. If necessary, please use command: sh auto_service.sh restart."
echo ""
fi
}
stop() {
# 重新获取一下pid,因为其它操作如start会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid为空时执行。 注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
if [ -z $pid ]; then
echo ""
echo "Service ${JAR_NAME} is not running! It's not necessary to stop it!"
echo ""
else
kill -9 $pid
echo ""
echo "Service stop successfully!pid:${pid} which has been killed forcibly!"
echo ""
echo "" > $LOG_PATH
fi
}
# 输出运行状态方法
status() {
# 重新获取一下pid,因为其它操作如stop、restart、start等会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid为空时执行。注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
if [ -z $pid ];then
echo ""
echo "Service ${JAR_NAME} is not running!"
echo ""
else
echo ""
echo "Service ${JAR_NAME} is running. It's pid=${pid}"
echo ""
fi
}
# 重启方法
restart() {
echo ""
echo ".............................Restarting.............................."
echo "....................................................................."
# 重新获取一下pid,因为其它操作如start会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid为空时执行。 注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
if [ ! -z $pid ]; then
kill -9 $pid
fi
start
echo "....................Restart successfully!..........................."
}
# 查看日志
logs(){
# 输出实时日志
tail -n 100 -f /Users/xxx/PackOnline/backEndDeploy/backEndLog/$LOG_PATH
}
# 根据输入参数执行对应方法,不输入则执行tips提示方法
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
"logs")
logs
;;
*)
tips
;;
esac
nohup 使用参考 https://www.cnblogs.com/baby123/p/6477429.html
定时任务开启
运行crontab -e 命令, 加入如下cron 任务,每天23:00 执行
0 23 * * * sh /Users/xxx/PackOnline/backEndDeploy/crontab.sh
#拷贝,将当日的日志拷贝到按照时间命名的文件中
cp /Users/xxx/PackOnline/backEndDeploy/backEndLog/service.log /Users/xxx/PackOnline/backEndDeploy/backEndLog/`date "+%Y-%m-%d-%H-%M-%S"`_apppack.log
#清空, 将日志文件内容清空,不能删除文件,否则原先的日志输出无法找到对象
echo "" > /Users/hongboni/PackOnline/backEndDeploy/backEndLog/service.log
#检查7天前的文件进行删除
find /Users/hongboni/PackOnline/backEndDeploy/backEndLog -mtime +7 -name "*apppack.log" -exec rm {} \;
关于find 命令按照时间找文件可参考如下图理解:
-ctime -n 查找距现在 n*24H 内修改过的文件
-ctime n 查找距现在 n*24H 前, (n+1)*24H 内修改过的文件
-ctime +n 查找距现在 (n+1)*24H 前修改过的文件
---(+n)----------|----------(n)----------|----------(-n)---
(n+1)*24H前| (n+1)*24H~n*24H间 |n*24H内