【发布时间】:2018-02-15 10:53:53
【问题描述】:
我正在编写一个 bash 脚本,该脚本在我的 Java 服务器应用程序请求重新启动服务器时运行。该脚本执行需要在 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();
此脚本执行以下操作来解除另一个处理所有重启逻辑的脚本。如下所示:
#!/bin/bash
(bash /some/directory/shutdownHandler.sh "true" &)
exit 0
当我在 Java 应用程序中调用包含 ProcessBuilder 逻辑的函数时,我看不到 shutdownHandler.sh 脚本中逻辑的效果。即使是简单的文本回显到文件中也不会发生。我已经检查过我是否拥有正确的权限。
当我直接从命令行执行 restart.sh 时,它按预期工作。
请就我看到这种行为差异的原因提出建议。 Java 是否有某种方式杀死了守护进程脚本?
【问题讨论】:
-
您是否尝试过将脚本作为参数运行 bash?
-
您指的是 Java ProcessBuilder 吗?如果是这样,restart.sh 脚本确实包含一个 shebang 行(我刚刚编辑了要包含的问题)。这应该意味着使用 shebang 中的解释器调用脚本,并将脚本作为第一个参数。
-
我不确定Java是否尊重shebang,所以明确设置shell可能会解决问题
-
我不确定 Java 是否能够杀死守护进程,但您可以尝试使用
nohup调用它吗?nohup bash /some/directory/shutdownHandler.sh "true" &