从批处理文件中从Java启动的Kill进程
我有一个启动服务器的第三方.bat文件(wso2server.bat) 我从一开始从批处理文件中从Java启动的Kill进程,java,windows,batch-file,cmd,process,Java,Windows,Batch File,Cmd,Process,我有一个启动服务器的第三方.bat文件(wso2server.bat) 我从一开始 Process process = Runtime.getRuntime.exec(cmd /C start cmd /C C:\wso\wso2esb-4.9.0\bin\wso2server.bat); 我试图阻止这一切 process.destroy(); and process.destroyForcibly(); process.isAlive()在销毁后返回“false”。但服务器仍在运行
Process process = Runtime.getRuntime.exec(cmd /C start cmd /C C:\wso\wso2esb-4.9.0\bin\wso2server.bat);
我试图阻止这一切
process.destroy();
and
process.destroyForcibly();
process.isAlive()在销毁后返回“false”。但服务器仍在运行
我也试着和你一起跑步
ProcessBuilder pb = new ProcessBuilder(params);
process = pb.start();
停止它,但不管我如何启动它,java.exe和服务器仍然在运行,我无法停止它。
我想这是因为蝙蝠开始了另一个过程
那么,如何停止这个java.exe呢?
start
命令不会等待进程完成,因此,如果batch命令只是运行服务器并退出,则无法控制服务器进程
使用start/wait…
命令运行批处理文件start/wait
将等待流程完成,因此您将有一个流程树,如
cmd "start"
cmd "batch"
server
要终止进程树,请使用taskkill/pid N/t/f
命令
获取根cmd
进程的PID
- 设置
title tocmd
root\u cmd
- 获取进程列表
- 用窗口标题
root\u cmd
- 提取PID并将其保存到
%TEMP%/PID.txt
title root_cmd for /f "tokens=2 delims=," %A in ('tasklist /v /fo csv ^| findstr root_cmd') do echo %~A>"%TEMP%/pid.txt"
- 运行服务器
cmd/c“title root_cmd&(for/f”tokens=2 delims=,%A in('tasklist/v/fo csv^ | findstr root_cmd')do echo%~A>%TEMP%/pid.txt”)&start/wait“cmd/c wso2server.bat”
- 杀死服务器
由set/p PID=filename
运行的命令未按预期工作。因此,我修改了方法:exec
start/wait“title”命令将设置cmd的标题并运行批处理文件
将杀死taskkill/fi“WINDOWTITLE eq启动器_cmd*”/t/f
进程及其子进程cmd“title”
- 由于我们在任何地方都使用
,因此在杀死子进程之后,根进程也将退出cmd/c
Runtime.getRuntime().exec(“cmd/c start c:\wso\wso2esb-4.9.0\bin\wso2server.bat”)有什么问题代码>?甚至可能是
Runtime.getRuntime().exec(“cmd/c:\wso\wso2esb-4.9.0\bin\wso2server.bat”)代码>?cmd/c start:服务器启动,但无法停止(同上),但使用cmd/c:服务器不启动。java.exe出现在任务管理器中,但Http站点不可用。在本例中,start不是对服务器的指令,而是对批处理文件的指令,我不明白为什么
不会启动服务器。bat文件的内容是什么?据我所知,在Windows中,您将使用cmd/c file.bat
C:\wso\wso2esb-4.9.0\bin\wso2server.bat启动服务器--运行
,并要求在cmd.exe窗口中执行
,以停止该服务器。感谢您的回复。我尝试了这个命令:Runtime.getRuntime().exec(“cmd/c\”title root\u cmd&(for/f\”tokens=2 delims=,\%A in('tasklist/v/fo csv^ findstr root\u cmd')do echo%~A>\%TEMP%/pid.txt\”&start/wait\““cmd/c:\\wso\\wso2esb-4.9.0\\bin\\wso2server.bat”);不幸的是,它启动了2 cmd窗口,但没有启动服务器。打印屏幕:添加了Java示例。Ctrl-C
package com.example; import java.io.IOException; import java.lang.Runtime; public class Main { public static void main (String args[]) { try { if (args.length < 1) { System.out.println("Start server"); Runtime.getRuntime().exec(new String[]{ "cmd", "/c", "start /wait \"launcher_cmd\" s.bat"}); } else { System.out.println("Stop server"); Runtime.getRuntime().exec(new String[]{ "cmd", "/c", "taskkill /fi \"WINDOWTITLE eq launcher_cmd*\" /t /f"}); } } catch(IOException e) { System.out.println(e); } } }