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