我试图通过以下代码执行sh文件(CentOS机器顺便说一句)
Runtime.getRuntime().exec("sh " + file.getPath());
我使用此代码的Windows,它工作正常
Runtime.getRuntime().exec("cmd /c start " + file.getPath());
可能是因为我在.sh文件中使用Screen?我也使用java命令启动服务器所以我可能需要包含这些?
这是sh文件的内容
#!/bin/sh
BINDIR=$(dirname "$(readlink -fn "$0")")
cd "$BINDIR"
screen -S PrivateServer java -Xms2048M -Xmx2048M -jar somejar.jar -o true
我也是从关机钩子运行这个代码,这可能是问题吗?这是因为该软件是一个游戏服务器,它的目的是让用户可以使用重启命令或让它自动重启,而无需自己设置任何东西。
编辑:我决定将错误输出到文本文件,并发现“必须连接到终端”。有任何想法吗?我认为这与使用屏幕有关。
由于您确认该文件具有可执行权限,因此请尝试按如下方式传递参数:
Runtime.getRuntime().exec(new String[]{"/bin/sh" ,"-c", file.getPath()});
所以主要提供sh
的完整路径并使用-c
Yo需要设置操作的权限,通常“sh”文件需要执行权限才能从Java应用程序运行此脚本。您必须以root(sudo su)或sudo java -jar运行Java应用程序。或者设置对脚本“sudo chmod 777 ...”的完全访问权限,不是完全访问权限,但对于任何想要执行脚本的用户至少设置chmod + x。
最好的祝福。
我建议使用org.apache.commons.exec。*来运行。
它似乎没有可执行权限,尝试在执行shell脚本之前执行"chmod +x shell_script_filename"