windows 通过 bat 脚本后台启动 jar 包,通过 jps 找到 pid,然后停止指定 jar 包,附 linux shell 脚本启停脚本

后台运行的原因

在 windows 上,在 cmd 命令窗口,使用 java -jar 的方式启动,cmd 窗口会一直存在,若关闭,程序也就停止运行了,所以需要后台运行

说明

windows 通过 bat 脚本后台启动 jar 包,通过 jps 找到 pid,然后停止指定 jar 包,附 linux shell 脚本启停脚本

参考

springboot 程序,lib 下是依赖 jar
windows 通过 bat 脚本后台启动 jar 包,通过 jps 找到 pid,然后停止指定 jar 包,附 linux shell 脚本启停脚本_第1张图片

windows 端启停脚本

1. 启动脚本
bat 启动无法输出日志到文件,但是拷贝命令到 cmd 就可以输出到文件,不懂为什么
若启动多个 jar 包,须保证 jar 包名称不同。

@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

2. 停止脚本
解析:通过 jps -l 命令,找到程序对应的进程 id,即 pid,然后终止 pid 即可。其中,indi.tudan.analogaccess.AnalogAccessApplication 为程序入口类包路径。

@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. 启动脚本

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" indi.tudan.analogaccess.AnalogAccessApplication > ./logs/analog-access.log 2>&1 &

2. 停止脚本

#!/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

  1. jvm.dll
    jvm.dll 是一个 java 虚拟机在 windows 平台环境上的实现,也是 JRE 的一部分,一个 C 程序能够使用 jvm.dll 直接运行在 jvm 上。

  2. java.exe
    java.exe 是 win32 控制台应用,它提供了一种帮助,代替使用 jvm.dll 执行 java classes 文件,作为一个 win32 控制台应用,显然他是和一个控制台相关联,当执行 java classes 的时候,它运行。

  3. 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 参数

你可能感兴趣的:(批处理,Java,Linux)