当前位置: 首页 > 面试题库 >

如何从Java运行Shell脚本并使其在JVM关闭后继续运行?

轩辕翰
2023-03-14
问题内容

我正在编写插件以便在Linux上重新启动服务器应用程序(尽管我正在OSX上进行测试)。我这样做的方法是使用Shell脚本,该脚本命令应用程序停止运行,然后监督进程的终止,并在需要时安全地启动一个新的进程。

当我从命令行手动执行脚本时,脚本即可工作。但是,当我从应用程序内部执行它时,shell进程与应用程序一起被杀死。

我尝试了两种不同的从Java运行过程的方法:

String scriptArgs[] = {"sh", "restart.sh", "&"};

    try {
        Runtime.getRuntime().exec(scriptArgs);
    } catch (IOException e) {
        e.printStackTrace();
    }

ProcessBuilder processBuilder = new ProcessBuilder("sh", "restart.sh");
    try {
        processBuilder.directory(new File(System.getProperty("user.dir")));
        processBuilder.redirectErrorStream(false);
        processBuilder.start();
    } catch (IOException e) {
        e.printStackTrace();
    }

这两种方法的结果相同:调用脚本,成功关闭应用程序,然后在继续执行之前死亡。是否有任何方法可以从Java 启动 完全 独立的进程?


问题答案:

从Java运行进程时,您正在创建一个Shell实例,然后再运行该进程。即使此进程在后台运行,shell也只会在此过程完成后退出&

要以无头模式运行进程,您需要使用nohup命令。有关详细信息,请参见此处。

用法如下所示:

ProcessBuilder processBuilder = new ProcessBuilder("nohup", "sh", "restart.sh");
try {
    processBuilder.directory(new File(System.getProperty("user.dir")));
    processBuilder.redirectErrorStream(false);
    processBuilder.start();
} catch (IOException e) {
    e.printStackTrace();
}


 类似资料:
  • 问题内容: 我有一个shell脚本 随机播放大型文本文件(600万行和6列) 根据第一列对文件进行排序 输出1000个文件 所以伪代码看起来像这样 有没有一种方法可以运行此Shell脚本以充分利用多核CPU? 在这一刻, 。按1到1000的顺序执行,非常慢。 谢谢你的帮助。 问题答案: 查看bash子外壳程序,这些外壳程序可用于并行运行脚本的各个部分。 我还没有测试过,但这可能是一个开始:

  • 我正在使用VS代码来编辑和运行Android项目。模拟器将打开,我看到程序启动,然后是程序的编译和运行。但是,在关闭了Android模拟器和VS代码之后,OpenJDK继续运行。 这是正常行为吗?有没有办法在模拟器/VSC退出后关闭OpenJDK JRE? 我主要关心的是电池寿命,因为我正在使用笔记本电脑。 系统:Windows 10 Pro(1909) Visual Studio代码版本:1.4

  • 问题内容: 从Java运行Unix命令非常简单。 但是可以从Java代码运行Unix Shell脚本吗?如果是,从Java代码中运行Shell脚本是一个好习惯吗? 问题答案: 你应该真正看一下Process Builder。它确实是为这种事情而构建的。

  • 问题内容: 我正在尝试从Java执行Bash Shell脚本,并且使用这段代码可以正常运行。 上面的代码异步运行良好。但是我想实现的是同步执行代码。我希望Java进程等到脚本执行完成后再执行下一批代码。 总而言之,我希望在批处理文件(“ myscript.sh”)完成执行 之后 执行“打印语句-脚本成功执行”。 谢谢 问题答案: 你要等待进程结束,这是WAITFOR()这样的

  • 问题内容: 我快要解决这个问题了。 下面是代码: 问题答案: 您的代码是正确的,我相信您不会收到异常,如果您使用进行阅读,则不会得到任何东西。 已经说过,现在命令是100%以这种方式执行,这是因为您正在回显某些内容,需要使用来将其读回。 检查以下示例,该示例将成功创建一个名目录并打印您正在回显的内容。为了将其放入日志文件,恐怕您可以使用“>”来完成它,您可能必须使用一些编辑器命令或使用Java创建

  • 问题内容: 我有一个程序,需要很多时间才能完成。它以root身份通过ssh运行。 我希望它在注销后继续运行,这可能吗,我将如何实现? 问题答案: 假设您有一个在前台运行的程序,请 按ctrl-Z ,然后: 如果只有一项作业,则无需指定作业号。只需使用和即可。 以上步骤说明: 您按ctrl-Z。系统挂起正在运行的程序,显示作业编号和“已停止”消息,并返回到bash提示符。 您键入命令(该命令已在其中