后台运⾏的原因
在 Windows 上,在 Cmd 命令窗⼝,使⽤ java -jar 的⽅式启动,Cmd 窗⼝会⼀直存在,若关闭,程序也就停⽌运⾏了,所以需要后台运⾏
说明
Windows 通过 Bat 脚本后台启动 Jar 包,通过 Jps 找到 PId,然后停⽌指定 Jar 包,附 linux shell 脚本启停脚本
参考
Springboot 程序,lib 下是依赖 Jar
Windows 端启停脚本
启动脚本
Bat 启动⽆法输出⽇志到⽂件,但是拷贝命令到 Cmd 就可以输出到⽂件,不懂为什么。若启动多个 Jar 包,须保证 Jar 包名称不同。
1
2
3
4
5
6
7
|
@echo off
echo find analog-access-1.0.jar to kill before start process.
call stop.bat
echo "------ begin start analog-access-1.0.jar, see: ./logs/analog-access.log.------"
start javaw -Xms1024m -Xmx2048m -Dsun.lang.ClassLoader.allowArraySyntax=true -Duser.timezone=GMT+08 -cp analog-access-1.0.jar;lib/*; indi.tudan.
analogaccess.AnalogAccessApplication 1>>.\logs\analog-access.log 2>&1 &
exit
|
停⽌脚本
解析:通过 Jps -l 命令,找到程序对应的进程 Id,即 PId,然后终⽌ PId 即可。其中,indi.tudan.analogaccess.AnalogAccessApplication 为程序⼊⼝类包路径。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@echo off
set program=indi.tudan.analogaccess.AnalogAccessApplication
echo program: %program%
for/f "usebackq tokens=1-2" %% a in (`jps -l ^| findstr %program%`)do(
set PId = %% a
set image_name = %% b
)
if not defined PId (echo process %program% does not exists) else (
echo prepare to kill %image_name%
echo start kill %PId%...
rem 根据进程Id,kill进程
taskkill /f /pid %PId%
)
|
Linux 端启停脚本
启动脚本
1
2
3
4
5
6
7
8
9
10
11
|
echo "find analog-access-1.0.jar to kill before start process."
sh stop.sh
echo "------ begin start analog-access-1.0.jar, see: ./logs/analog-access.log. ------"
lib_names = `ls -l ./lib |awk'{if($NF~/jar/) print $NF}'`
import_libs = ""
for lib_name in $lib_names
do
import_libs = $import_libs":./lib/"$lib_name
done
nohup java -Xms1024m -Xmx2048m -Dsun.lang.ClassLoader.allowArraySyntax=true -Duser.timezone = GMT+08 -cp "./analog-access-1.0.jar$import_libs" i
ndi.tudan.analogaccess.AnalogAccessApplication > ./logs/analog-access.log 2>&1 &
|
停⽌脚本
1
2
3
4
5
6
7
8
9
10
11
|
#!/bin/sh
PROCESS = `ps auxww |grep'analog-access-1.0.Jar'|grep'indi.tudan.analogaccess.AnalogAccessApplication'|grep -v grep`
if["$PROCESS"=""];then
echo "process analog-access-1.0.jar not exists"
else
SId = `echo $PROCESS |awk'{print $2 }'`
echo "prepare to kill "$PROCESS
echo "begin kill "$SId" ..."
kill -9 $SId
echo "kill successfully"
fi;
|
jvm.dll、java.exe、javaw.exe
jvm.dll
jvm.dll 是⼀个 Java 虚拟机在 Windows 平台环境上的实现,也是 JRE 的⼀部分,⼀个 C 程序能够使⽤ jvm.dll 直接运⾏在 Jvm上。
java.exe
java.exe 是 win32 控制台应⽤,它提供了⼀种帮助,代替使⽤ Jvm.dll 执⾏ java classes ⽂件,作为⼀个 Win32 控制台应⽤,显然他是和⼀个控制台相关联,当执⾏ java classes 的时候,它运⾏。
javaw.exe
javaw.exe 是相似的和 java.exe 是⼀个 Win32 的 GUI 应⽤,应⽤提供⾃⼰的 GUI 窗⼝,不启⽤控制台。
区别
- java 运⾏ Jar 以后,会阻塞在那⾥直到窗⼝关闭。
- javaw 运⾏ Jar 后,不会阻塞,直接就可以进⾏下⼀条命令的运⾏了。
Jps
Jps 的英⽂名称是 JVM Process Status Tool, 功能和 ps 命令类似。可以列出正在运⾏的虚拟机进程、显⽰虚拟机执⾏主类(main () 函数所在的类)的名称、这些进程的本地虚拟机的唯⼀ Id(LVMId, Local Virtual Machine Identifier,LVMId 和 PId 是⼀致的)。
选项 |
作⽤ |
-q |
只输出 LVMId (PId) |
-m |
输出虚拟机进程启动时传递给主类 main () 函数的参数 |
-l |
输出主类的全名,如果进程执⾏时是 Jar 包,输出 Jar 路径 |
-v |
输出虚拟机进程启动时 JVM 参数 |