【问题标题】:Create a new process in current console window在当前控制台窗口中创建一个新进程
【发布时间】:2011-10-10 09:25:41
【问题描述】:

我有一个 Java 应用程序,例如需要重新启动自身(但也需要启动其他进程)。目前这是通过关闭当前应用程序然后使用 ShutdownHook 和 ProcessBuilder 启动一个新实例来完成的。

我现在的问题是新进程在后台某处运行并且没有自己的控制台窗口。在 windows 机器上,可以使用创建一个新的控制台窗口

cmd /c start "windowtitle" java -jar myApp.jar

但这会创建 2 个进程:cmd 进程和由“start”启动的 java 进程。例如,这使得无法获取已启动进程的 stdout 和 stderr,因为我们只获取 cmd 进程的这些流,而不是由“start”命令启动的流。

对我来说最好的解决方案是为新进程重用当前控制台窗口,但这似乎无法实现,因为我没有找到任何有关如何执行此操作的信息。 此外,我希望有一个适用于 Unix 机器的解决方案。

【问题讨论】:

    标签: java console window build-process


    【解决方案1】:

    看来,您应该使用小型 console 程序启动器 for java。它必须启动 java 并立即退出。

    #include <windows.h>
    #include <tchar.h>
    
    int main(int argc, char** argv)
    {
      STARTUPINFO si = {sizeof(si)};
      PROCESS_INFORMATION pi = {};
      CreateProcess(NULL,_T("java -jar myApp.jar"),0,0,0,NORMAL_PRIORITY_CLASS,0,0,&si,&pi);
      return 0;
    }
    

    【讨论】:

      【解决方案2】:

      我不知道这是否是您正在寻找的,但它可能会有所帮助。

      List<String> command = Arrays.asList("java", "-jar", "myApp.jar");
      ProcessBuilder builder = new ProcessBuilder(command);
      builder.redirectErrorStream(true);
      Process process = builder.start();
      
      InputStream is = process.getInputStream();
      final InputStreamReader isr = new InputStreamReader(is);
      final BufferedReader br = new BufferedReader(isr);
      
      String line = null;
      while ((line = br.getLine()) != null) {
          System.out.println("child process: " + line);
      }
      
      process.waitFor();
      

      builder.redirectErrorStream(true); 会将标准错误重定向到标准输出,而 while 循环会将子进程的标准输出写入主应用程序的标准输出。不要忘记try catch StreamsBuffers

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        • 2015-01-01
        • 1970-01-01
        • 2023-03-28
        相关资源
        最近更新 更多