【问题标题】:Limitation of Java Process object [closed]Java Process对象的限制[关闭]
【发布时间】:2022-01-22 14:15:01
【问题描述】:

只是想知道 java Process 对象在执行包含超过 200 个 curls 命令的 shell 文件方面是否有任何限制。

当我运行 java 代码时,它只执行大约 150 个 curl 命令,其余的 curl 没有被执行或失败,因为我在输出 json 文件中看不到结果,如果 curl 命令在一个shell文件小于100。

下面是我的java代码:

public static void RunShellFiles(String _FILES_PATH){
    final File shellfolder = new File(_FILES_PATH);
    for (final File fileEntry : shellfolder.listFiles()) {
        if ((fileEntry.getName().toLowerCase().endsWith(".sh")) && (!fileEntry.getName().startsWith("~$"))) {
            try {
                String outputJsonFile = _FILES_PATH + "/" + fileEntry.getName().replace(".sh", ".json");
                ProcessBuilder pBuilder = new ProcessBuilder();
                // grant exe permission to newly created .sh file and wait for 5 seconds
                pBuilder.command("bash", "-c", "chmod 775 " + fileEntry.getAbsolutePath());
                Process grantPermProcess = pBuilder.start();
                TimeUnit.SECONDS.sleep(5);
                // execute shell files.
                Process p = new ProcessBuilder(fileEntry.getAbsolutePath()).redirectOutput(ProcessBuilder.Redirect.appendTo(new File(outputJsonFile))).start();
            }
            catch (IOException | InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

以下是我在 shell 文件中的 curl 命令之一:

curl -u $(cat ~/prod-login) -H 'Accept: application/json' -H 'X-xxxx-Program-xxxx-Code:xxx' -H 'Content-Type: application/json' -X POST 'https://xxx.xxx.xxx' -d '{"xxx": "1234567891234567"}'

【问题讨论】:

  • “静默失败”可能是因为您没有在任何地方发送 stderr 或检查进程退出状态?
  • 此外,您不是在等待钓鱼的过程,第一个是您正在睡觉并希望它完成,而第二个您甚至没有这样做。
  • Java 对您可以启动的进程数量没有任何限制。操作系统可能。但是您需要查看进程 stderr 和 stdout 流中的错误消息,并检查它们的退出代码。
  • (例如,在 Linux 上,ulimit -u ... 将限制用户可用的进程数量,还有其他方式可以对用户或 Java 应用程序进行系统限制。)
  • 感谢 tgdavies 等人。我之前确实在代码中放置了一个waitFor并将错误重定向到错误文件,但是一旦我将waitFor放入代码中,似乎线程永远不会完成并永远挂在那里:

标签: java json curl


【解决方案1】:

感谢 tgdavies 等人。我之前确实在代码中放置了一个waitFor并将错误重定向到一个错误文件,但是一旦我将waitFor放入代码中,似乎线程永远不会完成并永远挂在那里,并且错误文件从未创建,因此我删除了等待和标准错误。

Process p = new ProcessBuilder(fileEntry.getAbsolutePath()).redirectOutput(ProcessBuilder.Redirect.appendTo(new File(outputJsonFile))).start();
                int exitValue = p.waitFor();
                if (exitValue != 0){
                    p = new ProcessBuilder(fileEntry.getAbsolutePath()).redirectError(ProcessBuilder.Redirect.appendTo(new File(outputErrFile))).start();
                }

【讨论】:

  • “线程永远不会完成”问题很可能是因为您没有在使用标准输出的同时使用标准错误。上面的代码可能永远不会到达那个“if”语句,具体取决于进程正在写入哪个流。
  • 感谢 DuncG,我决定动态创建最多 150 个卷曲的文件,而不是花大量时间了解内容和方式,这并不理想,但希望它能满足要求,将更新今天晚些时候到这个帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 2014-03-20
  • 1970-01-01
相关资源
最近更新 更多