diff --git a/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java b/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java index 212cc7ad..95370f3f 100644 --- a/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java +++ b/Partner-Main/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java @@ -114,29 +114,53 @@ public class LocalRunnerClient extends RunnerClient { private SystemExecResult exec(String... command) { SystemExecResult result = new SystemExecResult(); - - List resultList = new ArrayList<>(); - result.setResultList(resultList); - StringBuilder s = new StringBuilder(); + List output = new ArrayList<>(); + List error = new ArrayList<>(); try { - Process process = Runtime.getRuntime().exec(command); - BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); - String line; - while ((line = reader.readLine()) != null) { - s.append(line); - resultList.add(line); - } + Process process = new ProcessBuilder(command) + .redirectErrorStream(false) // 分开读 + .start(); + + Thread stdoutThread = new Thread(() -> { + try (BufferedReader r = new BufferedReader( + new InputStreamReader(process.getInputStream()))) { + String line; + while ((line = r.readLine()) != null) { + output.add(line); + } + } catch (Exception ignored) { + } + }); + + Thread stderrThread = new Thread(() -> { + try (BufferedReader r = new BufferedReader( + new InputStreamReader(process.getErrorStream()))) { + String line; + while ((line = r.readLine()) != null) { + error.add(line); + } + } catch (Exception ignored) { + } + }); + + stdoutThread.start(); + stderrThread.start(); + int exitCode = process.waitFor(); + stdoutThread.join(); + stderrThread.join(); + result.setOk(exitCode == 0); - result.setTotal(s.toString().isEmpty() ? "响应为空" : s.toString()); + result.setResultList(output.isEmpty() ? error : output); + result.setTotal(String.join("\n", + output.isEmpty() ? error : output)); + } catch (Exception e) { result.setOk(false); - result.setTotal(e.getLocalizedMessage()); - } - if (result.getTotal().isEmpty()) { - result.setOk(false); + result.setTotal(e.getMessage()); } + return result; }