Java ProcessBuilder无法启动GNU屏幕

问题描述 投票:2回答:1

我正在经历Java的ProcessBuilder的怪异行为。我想做的是使用外壳程序停止正在运行的屏幕,删除一些文件夹,然后使用另一个外壳程序脚本重新启动屏幕。第一步,杀死正在运行的屏幕,可以使用以下命令完美运行:

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

在这个stop.sh shell中,我只是运行

screen -X -S generator kill

可以正常工作。之后,我使用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个回答
2
投票

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

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

尝试一下:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.