Java 如何使用Runtime.getRuntime().exec使用文件调用sh shell?

Java 如何使用Runtime.getRuntime().exec使用文件调用sh shell?,java,runtime.exec,processbuilder,Java,Runtime.exec,Processbuilder,如何在linux终端中使用java中的Runtime.getRuntime().exec调用sh文件 我想从java代码中调用新终端中的sh文件。如果我只在终端中运行它,它将作为一个单独的进程运行,即使我的程序退出,它也不会关闭。这就是为什么我没有使用ProcessBuilder,它会在使用它的程序退出时停止它调用的进程。如果您的脚本被标记为可执行(chmod+xscript.sh),您可以通过exec(“./script.sh”)调用它。否则,您可以使用exec(“sh script.sh”)

如何在linux终端中使用java中的
Runtime.getRuntime().exec
调用sh文件


我想从java代码中调用新终端中的sh文件。如果我只在终端中运行它,它将作为一个单独的进程运行,即使我的程序退出,它也不会关闭。这就是为什么我没有使用
ProcessBuilder
,它会在使用它的程序退出时停止它调用的进程。

如果您的脚本被标记为可执行(
chmod+xscript.sh
),您可以通过
exec(“./script.sh”)
调用它。否则,您可以使用
exec(“sh script.sh”)
直接调用它使用:

Runtime.getRuntime().exec(new String[] { "/bin/bash", "-c", "sh myfile.sh" });

由于
ProcessBuilder
只是
Runtime
的一个薄薄包装,直接使用它并不能实现您想要的功能

相反,您需要编写第二个脚本,创建一个终端窗口作为后台进程并分离此进程。一般做法:

  • ProcessBuilder
    启动外部脚本
  • 外部脚本使用Linux命令为内部脚本创建分离的进程。例如:`nohupxterm-e/bin/bash“script.sh&”

  • nohup
    切断新X终端和Java进程之间的连接
    &
    将整个过程发送到后台,因此直到
    xterm
    退出,命令才会执行。

    可能需要重复的操作是运行终端仿真器,将脚本作为参数传递。您使用哪种终端仿真器?Xterm,gnome终端,konsole?可能重复的