You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows环境下JMeter JSR223 Sampler执行Bash脚本无输出求助

解决JMeter JSR223 Sampler执行Bash命令无输出的问题

问题分析

你的代码存在几个关键问题,导致无输出:

  • 直接用Runtime.getRuntime().exec()传递整串命令,Windows下bash对带路径和参数的命令解析容易出错。
  • 未读取错误输出流,若命令执行出错,错误信息会阻塞进程,导致无输出。
  • waitFor()放在读取流之前,可能因输出缓冲区满导致进程挂起。

修复后的Groovy代码

String playerToken = vars.get("playerToken");
// 拆分命令为数组,避免解析歧义
String[] command = [
    "C:/Windows/System32/bash.exe",
    "-c",
    "cd C:/app/docs/release/ && ./no_longer_duplicate.bash ${playerToken} 6565"
];
StringBuffer output = new StringBuffer();
StringBuffer errorOutput = new StringBuffer();

Process p;
try {
    // 用ProcessBuilder更灵活,可直接指定工作目录
    ProcessBuilder pb = new ProcessBuilder(command);
    pb.directory(new File("C:/app/docs/release/"));
    p = pb.start();

    // 单独线程读取标准输出,避免进程阻塞
    Thread outputThread = new Thread(() -> {
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            output.append(line + "\n");
        }
    });

    // 单独线程读取错误输出,捕获执行异常信息
    Thread errorThread = new Thread(() -> {
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            errorOutput.append(line + "\n");
        }
    });

    outputThread.start();
    errorThread.start();

    // 等待进程结束及读取线程完成
    p.waitFor();
    outputThread.join();
    errorThread.join();

    // 打印输出和错误信息
    log.warn("标准输出:\n" + output.toString());
    if (!errorOutput.toString().isEmpty()) {
        log.warn("错误输出:\n" + errorOutput.toString());
    }

} catch (Exception e) {
    log.error("命令执行失败: " + e.getMessage(), e);
}

关键优化点

  • 用ProcessBuilder替代Runtime.exec,支持可靠的参数拆分和工作目录设置。
  • 双线程分别读取标准输出和错误输出,避免缓冲区满导致进程阻塞。
  • 先启动读取线程再调用waitFor(),确保输出能被及时捕获。
  • 同时输出错误信息,便于排查命令执行失败的原因。

内容的提问来源于stack exchange,提问作者vlatko606

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:10:31