Java ProcessBuilder执行多条Linux命令输出文件为空问题求助
代码核心问题
- 进程刚启动就调用
start.destroy()强制销毁,脚本还没执行就被杀死,自然不会有输出内容,同时程序立刻返回 - shell命令拼接逻辑错误:你写的
q是作为独立shell命令执行,系统不存在该命令,也不会传递到test_elanprv2.2.sh的标准输入流中,无法触发脚本的退出逻辑 - 没有调用
Process.waitFor()等待脚本执行完成,打印语句的执行时机和脚本执行进度完全无关 - 输出重定向写在shell命令中容易出现转义错误,ProcessBuilder本身提供了更可靠的输出重定向API
修复方案
- 移除
start.destroy()调用,替换为等待进程执行的逻辑 - 向脚本进程的标准输入流写入字符
q,触发脚本主动退出 - 调用
waitFor()阻塞等待进程执行完成后再进行后续操作 - 改用ProcessBuilder自带的输出重定向方法写入txt文件
注意:如果脚本会输出大量标准错误内容,建议添加
pb.redirectErrorStream(true)配置,将标准错误合并到标准输出中,避免缓冲区满导致进程阻塞。
修复后代码
public static void Linux(String fileName){ try { File dir = new File("/usr/local/bin"); // 构造输出文件对象 File outputFile = new File(fileName + ".txt"); // 仅启动目标脚本,不需要拼接多余shell命令 ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "./test_elanprv2.2.sh"); pb.directory(dir); // 直接配置进程输出重定向到目标文件 pb.redirectOutput(outputFile); // 可选:合并标准错误到输出,避免缓冲区满阻塞 pb.redirectErrorStream(true); Process start = pb.start(); // 向脚本的标准输入写入q和换行,触发退出逻辑 try (OutputStream os = start.getOutputStream()) { os.write("q\n".getBytes()); os.flush(); } // 阻塞等待脚本执行完成 int exitCode = start.waitFor(); if (exitCode == 0) { System.out.println("wrote text"); } else { System.out.println("script execute failed, exit code: " + exitCode); } } catch (Exception e){ e.printStackTrace(); System.out.println("failed to write text"); } }
内容的提问来源于stack exchange,提问作者user17085185
相关产品推荐
相关产品推荐

