通过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要好一些