后台运行jar包

平常我们运行jar包都是在命令行使用 java -jar 命令 , 这样运行后控制台一关 jar包的运行进程也关闭了,所以一般都是后台运行。

一、windows

在jar目录新建两个文件 start.bat 和 stop.bat , start.bat 用来启动 stop.bat 用来关闭

windows中文乱码应该将编码设置成 ASNI

start.bat 内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@echo off

title 准备启动设备驱动...................

color 3E

start javaw -jar -Dloader.path=.,resources,lib siccQh01.jar

echo .
echo ------------ 启动成功 --------------
echo .
echo ------------ 启动成功 --------------
echo .
echo ------------ 启动成功 --------------
echo .
echo ------------ 启动成功 --------------
echo .

timeout /t 2

exit

stop.bat 内容,杀死指定端口本地占用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@echo off & setlocal EnableDelayedExpansion

title 杀死端口
color 3E

set pid=0
set port=9019
for /f "tokens=2,5" %%b in ('netstat -ano ^| findstr ":%port%"') do (
set temp=%%b
for /f "usebackq delims=: tokens=1,2" %%i in (`set temp`) do (
if %%j==%port% (
taskkill /f /pid %%c
set pid=%%c
echo 本机端口号【%port%】相关进程以杀死
)
)
)
if !pid!==0 (
echo 端口号【%port%】没有占用
)

echo 操作完成
timeout /t 2

exit

bat文件杀死指定端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@echo off & setlocal EnableDelayedExpansion

title 杀死端口

set /p port=请输入端口号(0~65535):

set pid=0
for /f "tokens=2,5" %%b in ('netstat -ano ^| findstr ":%port%"') do (
set temp=%%b
for /f "usebackq delims=: tokens=1,2" %%i in (`set temp`) do (
if %%j==%port% (
taskkill /f /pid %%c
set pid=%%c
echo 端口号【%port%】相关进程以杀死
) else (
echo 不是本机占用端口【%port%】
)
)
)
if !pid!==0 (
echo 端口号【%port%】没有占用
)

echo 操作完成

pause

二、liunx

新建一个脚本文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改 推荐使用完整入径,不要使用相对路径
APP_NAME=/home/project/xia17user/xia17user-0.0.1.jar

#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 脚本名.sh [start|stop|restart|status]"
exit 1
}

#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}

#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
nohup java -jar $APP_NAME > /dev/null 2>&1 &
echo "${APP_NAME} start success"
fi
}

#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}

#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}

#重启
restart(){
stop
start
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac

设置为可执行文件

1
chmod +x ./start.sh

可用命令

1
2
3
4
./start.sh start
./start.sh stop
./start.sh status
./start.sh restart

三、限制JVM内存

设置JVM堆栈大小

可以通过命令行shell启动Jar包的时候手动进行设置

java -jar -Xmx1024M -Xms256M spring-boot-01-1.0-SNAPSHOT

-Xmx 表示JVM最大的内存

-Xms 表示JVM初始内存