通过bat脚本停止java进程的三个方法

通过bat脚本停止java进程的三个方法

1.拷贝java.exe

启动时复制java.exe程序修改进程映像名,然后通过映像名杀进程。

栗子

过程 操作
拷贝程序 拷贝一份java.exe程序,重名为tstop.exe,放在PATH下。
修改启动脚本 @echo off
title tstop
tstop -jar …/lib/laucher.jar … …/lib/*.jar,…/conf,
执行停止命令 C:\Users\alvin>tasklist | findstr tstop
tstop.exe 8520 Console 1 42,436 K
C:\Users\alvin>taskkill /f /im tstop.exe
成功: 已终止进程 “tstop.exe”,其 PID 为 8520。

优点: 操作简单可靠
缺点: 需要给每个java程序拷贝一份java.exe,映像名不能重复。

2.通过端口杀进程

通过端口找到PID,然后杀掉进程。

栗子
一个完整的脚本:

@echo off
rem 设置监听的端口号
set port=6200
echo port : %port%

for /f "usebackq tokens=1-5" %%a in (`netstat -ano ^| findstr %port%`) do (
	if [%%d] EQU [LISTENING] (
		set pid=%%e
	)
)

for /f "usebackq tokens=1-5" %%a in (`tasklist ^| findstr %pid%`) do (
	set image_name=%%a
)

echo now will kill process : pid %pid%, image_name %image_name%
pause
rem 根据进程ID,kill进程
taskkill /f /pid %pid%
pause

优点: 相对于第一种方案,不用有额外的操作拷贝java.exe
缺点: 脚本相对复杂(主要是不熟悉batch脚本语法)

问题分析:
启动java程序后,执行命令netstat -ano | findstr port

C:\Users\alvin>netstat -ano | findstr 6200
  TCP    0.0.0.0:6200           0.0.0.0:0              LISTENING       10332
  TCP    [::]:6200              [::]:0                 LISTENING       10332

当执行telnet localhost port后,再执行命令netstat -ano | findstr port

C:\Users\alvin>netstat -ano | findstr 6200
  TCP    0.0.0.0:6200           0.0.0.0:0              LISTENING       10332
  TCP    [::]:6200              [::]:0                 LISTENING       10332
  TCP    [::1]:62644            [::1]:6200             TIME_WAIT       0

所以脚本里面需要判断
[%%d] EQU [LISTENING]
这句

3.通过jps命令

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

栗子

过程 操作
启动程序 通过启动脚本启动程序
@echo off
title tstop
tstop -jar …/lib/laucher.jar … …/lib/*.jar,…/conf,
找到PID C:\Users\alvin>jps -l
5084 …/lib/ocean-laucher-1.0.5.6.jar
4696
9864 sun.tools.jps.Jps

参照栗子2遍历jps -l输出,找到PID 5084
通过PID杀掉进程 taskkill /f /pid 5084

优点: jps命令相对比netstat -ano语法清晰
缺点: java程序需要保证Jar包名(…/lib/laucher-1.0.5.6.jar)不同,相对拷贝java.exe要好一些

你可能感兴趣的:(batch,java)