关于如何打包jar排除指定文件,参见上一篇:

1.如下项目文件的位置:

java启动jar包占用内存过高 jar包启动后可以删除吗_springboot部署


之前我是通过指令来部署的:

ps -aux | grep java --查询java应用

kill -s 9 24204 --停止应用

cd /tpsys/applications/platformUpload --切换应用目录

nohup java -jar platformUpload-0.01.jar >run.log & --启动

这样比较繁琐,改用文件操作

这里使用3个文件来管理jar:
1.start.sh  负责启动,注意这里是>> 追加,后面会说明为什么用>>
#!/bin/bash
echo platformUpload-0.01.jar start
nohup  java -jar platformUpload-0.01.jar  >>run.log &

2.stop.sh  负责关闭应用
#!/bin/bash
PID=$(ps -ef | grep platformUpload-0.01.jar | grep -v grep | awk '{ print $2 }')
if [ -z "$PID" ]
then
    echo Application is already stopped
else
    echo kill $PID
	echo platformUpload-0.01.jar stopped
    kill $PID
fi

3.run.sh   先关闭应用再启动应用,并且删除原来的所有日志文件

#!/bin/bash
echo stop application
source stop.sh
echo delete logs and run.log
rm -rf ./logs
rm -rf  run.log
echo start application
source start.sh
注意:
1.如果执行报错,记得授权:chmod u+x *.sh
2.如过sh文件是在window下面编写的,那么在linux下需要更改格式:否则报错:
-bash: ./stop.sh: /bin/bash^M: bad interpreter: No such file or directory
解决方法:
sed -i "s/\r//"  xx.sh
或者使用dos2unix指令插件

2.上面已经把三个.sh文件编写好了.这里还有一个问题,如果run.log日志过大怎么处理?

这里我们可以采用定时任务分割run.log;同时清空原run.log文件;

2.1如何清空日志:

使用cat /dev/null > run.log

具体说明如下:

a.nohup java -jar XXX.jar &

使用这种方式运行的程序日志默认会输出到当前目录下的nohup.out文件,使用ctrl+c中断或者关闭窗口都不会中断程序的执行。

b.nohup java -jar xxx.jar >run.log &

我这里重定向到了run.log文件;

这种方式应用重新启动后,运行日志会自动清空;

在使用cat /dev/null >run.log清空日志后,原来的文件空间还在;

即虽然将内容清空了,但是下一次日志再写入时,原来的空间还是被占用,打开文件查看,发现之前的被空替代(内容位置还在);

如图:里面的空白就是替换后的null

java启动jar包占用内存过高 jar包启动后可以删除吗_定时任务_02

这一点原因,具体可以看:


c.nohup java -jar xxx.jar >>run.log & --追加形式(推荐的)
这种方式应用重新启动后,运行日志不会自动清空;
在使用cat /dev/null >run.log清空后,原来的文件空间全部清空;
这个才是我们需要的;这里 解释了上面的start.sh文件使用>>原因;

2.编写分割日志的splitRunLog.sh

#!/bin/bash
# Author: 
# Last Update: 2020年2月27日13:53:51
# Description: run.log 日志分割
 
this_path=$(cd `dirname $0`;pwd)   #根据脚本所在路径
current_date=`date -d "-1 day" "+%Y%m%d"`   #列出时间
cd $this_path
echo $this_path
echo $current_date  
 
do_split () {
    [ ! -d runlogs ] && mkdir -p runlogs
    split -b 20k -d -a 4 ./run.log   ./runlogs/run-${current_date}  #切分20k每块至runlogs文件中,格式为:run-xxxxxxxxxx
    if [ $? -eq 0 ];then
        echo "Split is finished!"
    else
        echo "Split is Failed!"
        exit 1
    fi
}
 
do_del_log() {
    find ./runlogs -type f -ctime +30 | xargs rm -rf #清理30天前创建的日志
    cat /dev/null > run.log #清空当前目录的run.log文件
}
 
if do_split ;then
    do_del_log
    echo "run.log is split Success"
else
    echo "run.log is split Failure"
    exit 2
fi
 
# crontab -e 添加定时任务:每周第一天的1点执行一次
#0 1 * * */1 /server/scripts/clearrun.sh &>/dev/null

#这里参考了:https://blog.51cto.com/ljohn/1909665

3.写入定时任务crontab,注意这里最好写绝对路径

打开crontab 文件,位置:
 crontab -e
 #添加如下指令,保存即可
 # 16:26分执行
 26 16 * * *  /tpsys/applications/platformUpload/splitRunLog.sh &>/dev/null    


#############################################################################
第一列 分钟: 1——59
第二列 小时: 0——23
第三列 日 : 1——31
第四列 月 : 1——12
第五列 星期: 星期0——6(0表示周天,1表示周一。。。)
第六列 要运行的任务命令(0表示键盘输入;1表示标准输出;2表示错误输出)默认值为1
前面五列有四种写法: 
* 表示第几分钟(小时/日/月/星期)执行一次 ;
*/n 表示每n分钟(小时/日/月/星期)执行一次;
T1-T2 表示从T1到T2分钟(小时/日/月/星期)要执行任务;
a,b,c 表示a,b,c分钟(小时/日/月/星期)分别执行一次; 
具体用法详见:

java启动jar包占用内存过高 jar包启动后可以删除吗_日志文件过大_03

分割的文件:注意分割后的文件时不带后缀的,具体查询split指令的 -a指令;

java启动jar包占用内存过高 jar包启动后可以删除吗_springboot_04