【发布时间】: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放入代码中,似乎线程永远不会完成并永远挂在那里: