代码之家  ›  专栏  ›  技术社区  ›  Nate

从JavaWeb服务启动外部进程的最佳方法?

  •  2
  • Nate  · 技术社区  · 17 年前

    我已经试过了:

    ProcessBuilder pb = new ProcessBuilder(arg);
    pb.start();
    

    以及:

    Runtime.exec(cmdString);
    

    但在以这种方式启动应用程序时,我遇到了奇怪的行为(即,即使进程仍处于活动状态,启动的应用程序也会停止工作。--从正常命令行手动运行时,应用程序工作正常)。

    是否有更好的方式启动外部流程?

    • waitfor() )在webservice中,这将不是一个理想的场景。
    • 是的,我们试图从Web服务开始的过程是由一位团队成员创建的[提示:你的眼睛转动…现在]

    我取得了成功 当我使用process builder启动bash脚本时,外部应用程序作为 背景过程 (使用“&”)。

    #!/bin/bash
    java -jar myApp.jar &
    

    这显然会创建一个孤立的进程,但至少应用程序会继续执行。

    5 回复  |  直到 17 年前
        1
  •  2
  •   Martin    17 年前

    通过“即使进程仍然处于活动状态,也会停止工作”,我假设您可能期望从已启动的应用程序中获得一些输出,而没有得到任何结果。

    尝试使用以下方法:

    ProcessBuilder pb = new ProcessBuilder(arg);
    Process p = pb.start();
    p.waitFor();
    

    waitFor()使当前线程在必要时等待,直到由该进程对象表示的进程终止。

    http://java.sun.com/javase/6/docs/api/java/lang/Process.html#waitFor()

        2
  •  2
  •   Antonio    17 年前

    我建议您在启动流程之前调用ProcessBuilder.redirectErrorStream()。然后,使用run()方法沿以下行创建一个线程:

    public void run() {
        BufferedReader reader = 
            new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
    }
    
        3
  •  2
  •   Tim Cooper    15 年前

    首先,这是在Windows上还是在Linux上发生的?另外,启动的应用程序应该或多或少做些什么?(它是脚本吗?它是二进制文件吗?它是吗 你的 二进制?)

    编辑

    好的,那么开始一个 bash 脚本(使用 ProcessBuilder java -jar myApp.jar )工作。

    当您尝试生成新的JVM时会发生什么 直接地 ProcessBuilder

    启动的应用程序停止工作

    1. 所启动的应用程序是指“java-jar myApp.jar”,当直接调用时, 不 通过中间产物
    2. 您传递给各个应用程序的准确完整的参数(及其值)是什么 ProcessBuilder 当您尝试直接启动Java而这个新JVM停止工作时,方法(以及以何种顺序)?(例如,提供带注释的代码)
    3. 如果你安装 lsof 在*nix机器上,显示与文件描述符2关联的文件(请参阅 FD 列)运行时: lsof -p 1234 1234 命令在这里。
    4. 在发出命令后的几秒钟内,您在上述步骤3中标识的文件(对于文件描述符2)附加了什么内容: kill -QUIT 1234 (在哪里 1234 是“挂起”JVM的进程ID吗?)
        4
  •  1
  •   Eddie    17 年前

    一种测试方法是编写一个运行程序的脚本,将标准输入、输出和错误重定向到文件。然后让web服务应用程序运行脚本而不是程序。如果程序以这种方式运行完成,那么问题在于处理进程的输出。

        5
  •  0
  •   Vasil    17 年前

    我猜问题可能是启动进程的线程在请求结束后被终止或其他什么。尝试在应用程序中使用一个线程,您可以确保它始终处于活动状态,您可以通过从其他线程调用它来启动进程。

    推荐文章