Java未在Ubuntu实例上运行bash脚本

Java未在Ubuntu实例上运行bash脚本,java,linux,bash,Java,Linux,Bash,我正在尝试使用Java在我的服务器上运行bash脚本 使用bash pm2\u StopStart.bash单独测试时,脚本可以工作 在Java中运行时,我没有遇到任何错误,例如找不到文件或权限被拒绝。这些都已经解决了 我使用的是ProcessBuilder,并遵循了无数的示例,包括 没有任何错误。当我输入不正确的文件目标时,我会在catch块中发现一个错误 看起来脚本根本没有执行。有什么建议吗 您的呼叫不会检查标准输出/错误流或等待进程。如果更改启动以将任何错误捕获到文件中,您将获得更多信息

我正在尝试使用Java在我的服务器上运行bash脚本

使用
bash pm2\u StopStart.bash单独测试时,脚本可以工作

在Java中运行时,我没有遇到任何错误,例如找不到文件或权限被拒绝。这些都已经解决了

我使用的是
ProcessBuilder
,并遵循了无数的示例,包括

没有任何错误。当我输入不正确的文件目标时,我会在catch块中发现一个错误

看起来脚本根本没有执行。有什么建议吗



您的呼叫不会检查标准输出/错误流或等待进程。如果更改启动以将任何错误捕获到文件中,您将获得更多信息:

File stdoutFile = new File("stdout.log");
File stderrFile = new File("stderr.log");
pb.redirectOutput(stdoutFile); 
pb.redirectError(stderrFile); // or pb.redirectErrorStream(true);
Process p = pb.start();

int rc = p.waitFor();
从JDK11开始,您可以使用它打印到文件:

Files.writeString(path, "message", StandardCharsets.UTF_8);
在Linux上,您需要以`#开头的文件/bin/bash’,或者您可能必须更改启动命令以指定bash:


String[]cmd=newstring[]{“bash”、“-c”、“/home/ec2 user/test/pm2_StopStart.bash”}

请注意,
bash somescript
并不意味着
system call(somescript)
可以工作。因为在第一种情况下,您要启动SHELL并给它一个脚本来读取和执行。这与直接调用脚本本身不同。
chmod+x
done对脚本执行,是的,它是可执行的。将检查有关shebang线路的信息,谢谢。编辑:包括。您的文件扩展名是
.bash
。您是否尝试改用
.sh
了?@AliCan类unix系统不关心文件扩展名.Hmm。接下来我要做的事情是:更改代码以使用。。。还有:别把事情弄得这么复杂。避免第二次文件写入。只需在本地运行代码,并将异常打印到stdout。意思是:一步一步走。所以,
bash-yourscript
起作用了。
yourscript
是否在shell中工作(可能是)。然后在本地运行
JavaSomeClass
(该类只使用process builder运行脚本),谢谢您的回答。我的bash脚本以
#开头/bin/bash
。我是否仍然需要在
cmd[]
字符串的开头包含
bash
?我似乎无法让它运行。另外,为什么我需要
“-c”
?目前,我刚刚
新建了ProcessBuilder(“/home/ec2 user/test/pm2\u StopStart.bash”)
我已经更新了答案-在调用
pb.start()后再次检查stderr文件。如果您不知道下一个参数是否是shell命令,-c”很有用-compare
bash-ls
vs
bash-c-ls
-没有它您就可以了。谢谢,在您的回答中,您还应该包括
新文件(“stderr.log)”
File stdoutFile = new File("stdout.log");
File stderrFile = new File("stderr.log");
pb.redirectOutput(stdoutFile); 
pb.redirectError(stderrFile); // or pb.redirectErrorStream(true);
Process p = pb.start();

int rc = p.waitFor();
Files.writeString(path, "message", StandardCharsets.UTF_8);