Java执行终端命令报错:无法运行程序,错误2:无此文件或目录
Hey,我刚碰到过类似的问题,马上帮你理清原因和解决办法!你遇到的cannot run program error=2 No such file or directory错误,其实是Runtime.exec()的一个常见坑。
错误核心原因
Runtime.getRuntime().exec()默认不会启动shell来解析你的命令——它会把你传入的整个字符串(lsof -i:10723 | grep node | awk '{print $2;}')当作一个单独的可执行文件路径来找,显然这不是一个合法的程序,所以才会报“找不到文件或目录”。
管道|、括号()这些都是shell的专属语法,必须让shell来执行才能生效,直接传给exec()肯定不行。
两种解决方法
方法一:让shell来执行命令(最简单推荐)
把你的命令作为参数传给bash(类Unix系统)或者cmd.exe(Windows),用-c参数指定要执行的命令字符串。修改后的代码如下:
try { // 调用bash并传入要执行的shell命令 Process p = Runtime.getRuntime().exec(new String[]{ "/bin/bash", "-c", "lsof -i:10723 | grep node | awk '{print $2;}'" }); BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); // 读取命令的标准输出 String s = null; System.out.println("Here is the standard output of the command:\n"); while ((s = stdInput.readLine()) != null) { System.out.println(s); } // 读取命令的错误输出(如果有) System.out.println("Here is the standard error of the command (if any):\n"); while ((s = stdError.readLine()) != null) { System.out.println(s); } } catch (Exception e) { e.printStackTrace(); }
- 如果你是在Windows系统运行(不过你的命令是类Unix的,大概率不是),把
/bin/bash换成cmd.exe,-c换成/c即可。 - 可以用
which bash命令确认你的系统中bash的实际路径,确保路径正确。
方法二:手动拆分命令处理管道(更可控但繁琐)
如果你不想依赖shell,可以把每个命令单独执行,在Java代码里手动处理管道逻辑——比如先执行lsof -i:10723,把它的输出作为grep node的输入,再把grep的输出传给awk。这种方式代码量会大很多,适合需要精细控制的场景,普通管道场景还是方法一更省心。
额外优化建议
推荐用ProcessBuilder代替Runtime.exec(),它的API更灵活,还能方便地合并错误输出和标准输出,代码可读性更好:
try { ProcessBuilder pb = new ProcessBuilder( "/bin/bash", "-c", "lsof -i:10723 | grep node | awk '{print $2;}'" ); pb.redirectErrorStream(true); // 把错误输出合并到标准输出,不用单独读取错误流 Process p = pb.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String s = null; System.out.println("Command output:\n"); while ((s = reader.readLine()) != null) { System.out.println(s); } } catch (Exception e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者akhilesh gulati
相关产品推荐
相关产品推荐

