使用ProcessBuilder运行shell脚本提示找不到文件或目录,求排查
Java执行Shell脚本抛出"No such file or directory"异常的问题
问题详情
我参考同类问题实现了以下Java代码,在public static main()方法中执行:
Process p = null; ProcessBuilder pb = new ProcessBuilder("scr.sh"); pb.directory(new File("/Users/alex/")); p = pb.start(); Thread.sleep(TimeConst.SECOND);
已经将scr.sh文件放置在/Users/alex/目录下,但运行时仍抛出异常:
Caused by: java.io.IOException: error=2, No such file or directory
请问代码存在什么问题?
问题诊断与解决方案
嘿,这个问题我之前踩过坑,咱们一步步拆解原因:
脚本缺少可执行权限:这是最常见的原因之一。就算脚本在正确的目录,如果没有执行权限,系统会认为它不是一个可执行的“有效文件”。你可以打开终端,切换到
/Users/alex/目录,执行命令:chmod +x scr.sh给脚本添加可执行权限后再试试。
ProcessBuilder的路径查找逻辑误解:你用
pb.directory()设置的是脚本运行时的工作目录,而不是脚本本身的查找路径。当你只传"scr.sh"给ProcessBuilder时,它会去系统的PATH环境变量里找这个脚本,而不是你指定的工作目录。解决办法很简单,直接传入脚本的绝对路径:ProcessBuilder pb = new ProcessBuilder("/Users/alex/scr.sh");这样就绕开了PATH查找的问题,直接定位到脚本文件。
脚本缺失shebang声明:如果你的
scr.sh第一行没有类似#!/bin/bash(或者你使用的shell路径)的声明,系统可能不知道用什么解释器来运行这个脚本。你可以在脚本的最开头加上这一行,明确告诉系统用哪个shell执行它。
另外提个小建议:Thread.sleep(TimeConst.SECOND)最好包裹在try-catch块里,处理InterruptedException,不过这和当前的异常没有直接关系。
内容的提问来源于stack exchange,提问作者Alex Kokorin




