【问题标题】:Java ProcessBuilder is not able to start GNU screenJava ProcessBuilder 无法启动 GNU 屏幕
【发布时间】:2020-09-19 02:30:35
【问题描述】:

我遇到了 java 的 ProcessBuilder 的奇怪行为。 我尝试的是使用 shell 停止正在运行的屏幕,删除一些文件夹,然后使用另一个 shell 脚本重新启动屏幕。 第一步,杀死正在运行的屏幕,完美运行使用:

 ProcessBuilder pb0 = new ProcessBuilder(System.getProperty("user.dir") + "/generator/stop.sh");

在这个 stop.sh shell 中我只是简单地运行

screen -X -S 生成器杀死

它应该可以正常工作。 之后,我使用 org.apache.commons.io.FileUtils 删除了我的目录,然后我想再次启动屏幕。目前我正在这样做:

    System.out.println("Restarting the generator");

    ProcessBuilder pb1 = new ProcessBuilder();
    pb1.directory(new File(System.getProperty("user.dir") + "/generator"));
    pb1.command("./start.sh");
    try {
        Process process = pb1.start();
        System.out.printf("Started the generator with %d", process.waitFor());
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }

这给出了“用 1 启动生成器”,这向我表明屏幕正在运行,而使用 screen -ls 检查时根本不是这种情况。 没有错误,不知道如何从这里继续前进

在 start.sh 中:

screen -S generator java -Xms2G -Xmx2G -jar generator.jar

PS:我使用的是 Debian 10。 也许有人可以在这里帮助我吗? 问候!

【问题讨论】:

    标签: java shell processbuilder gnu-screen


    【解决方案1】:

    你永远不应该忽略进程输出,因为它的缓冲区长度有限,如果你不使用它,它就会挂起。我不确定这是否会导致您的问题,但这绝对是您应该做的事情。

    进程也可能会抛出一些您看不到的错误,因为您忽略了它的输出(在这种情况下,这将帮助您调查问题)。

    试试这个:

    new ProcessBuilder()
      .redirectOutput(ProcessBuilder.Redirect.INHERIT)
      .redirectError(ProcessBuilder.Redirect.INHERIT)
      ...
    

    这会将进程输出流和输入流重定向到它的父级(即您的应用程序)。

    【讨论】:

    • 我已将您的建议添加到我现有的代码中,然后就可以了。出现新错误!我完全忘记了我的代码已经在屏幕上运行,因此 start.sh 没有连接到终端。我将 -S 更改为 -dmS 并且一切正常 感谢
    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多