目录

Windows通过Bat脚本后台启动Jar包,通过Jps找到PId,然后停⽌指定Jar包

后台运⾏的原因

在 Windows 上,在 Cmd 命令窗⼝,使⽤ java -jar 的⽅式启动,Cmd 窗⼝会⼀直存在,若关闭,程序也就停⽌运⾏了,所以需要后台运⾏

说明

Windows 通过 Bat 脚本后台启动 Jar 包,通过 Jps 找到 PId,然后停⽌指定 Jar 包,附 linux shell 脚本启停脚本

参考

Springboot 程序,lib 下是依赖 Jar

./1.jpg

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 窗⼝,不启⽤控制台。

区别

  1. java 运⾏ Jar 以后,会阻塞在那⾥直到窗⼝关闭。
  2. 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 参数