Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从批处理文件中从Java启动的Kill进程_Java_Windows_Batch File_Cmd_Process - Fatal编程技术网

从批处理文件中从Java启动的Kill进程

从批处理文件中从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”。但服务器仍在运行

我有一个启动服务器的第三方.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”。但服务器仍在运行

我也试着和你一起跑步

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

  • 设置
    cmd
    title to
    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不是对服务器的指令,而是对批处理文件的指令,我不明白为什么
    cmd/c file.bat
    不会启动服务器。bat文件的内容是什么?据我所知,在Windows中,您将使用
    C:\wso\wso2esb-4.9.0\bin\wso2server.bat启动服务器--运行
    ,并要求在cmd.exe窗口中执行
    Ctrl-C
    ,以停止该服务器。感谢您的回复。我尝试了这个命令: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示例。
    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);
            }
        }
    }