加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java执行运行守护程序脚本的Bash脚本

发布时间:2020-12-15 02:20:11 所属栏目:Java 来源:网络整理
导读:我正在处理一个在我的 Java服务器应用程序请求重新启动服务器时运行的bash脚本.此脚本执行的操作需要位于Java应用程序的进程树之外. 我使用ProcessBuilder以下列方式调用Java中的重启脚本: // Vars declared at the top of the fileprivate static final St
我正在处理一个在我的 Java服务器应用程序请求重新启动服务器时运行的bash脚本.此脚本执行的操作需要位于Java应用程序的进程树之外.

我使用ProcessBuilder以下列方式调用Java中的重启脚本:

// Vars declared at the top of the file
private static final String LOC = "/some/directory/";
private static final String RESTART_SCRIPT = LOC + "restart.sh";
...
// In the function that is invoked to handle reboot behavior
final ProcessBuilder pb = new ProcessBuilder(RESTART_SCRIPT);
Process p = pb.start();

此脚本执行以下操作以对另一个处理所有重新启动逻辑的脚本进行deamonize.它看起来如下:

#!/bin/bash
(bash /some/directory/shutdownHandler.sh "true" &)
exit 0

当我在Java Application中调用包含ProcessBuilder逻辑的函数时,我没有在shutdownHandler.sh脚本中看到逻辑的影响.即使是简单的文本到文件的回声也不会发生.我已经检查过我有正确的权限.

当我直接从命令行执行restart.sh时,它按预期工作.

请告诉我为什么我看到这种行为上的差异. Java有没有杀死守护程序的脚本?

解决方法

我建议你尝试以下简化:

final String[] RESTART_COMMAND = { "nohup","/some/directory/shutdownHandler.sh","true" };
final ProcessBuilder pb = new ProcessBuilder(RESTART_COMMAND);
Process p = pb.start();
//DON'T waitFor()

使用nohup和避免waitFor应该具有RESTART_SCRIPT实现的相同效果:两个进程的生命周期都是独立的(jvm不等待shutdownHandler.sh,Java进程的终止不会导致shutdownHandler的中断. SH).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读