【问题标题】:Java Execute Bash Script that runs a daemonized scriptJava Execute Bash Script 运行一个守护脚本
【发布时间】: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" &

标签: java linux bash


【解决方案1】:

我找到了一种方法来让脚本shutdownHandler.sh 在我描述的使用场景中正确触发。问题在于我是如何对shutdownHandler.sh 进行守护进程的。我已将restart.sh 更改为:

#!/bin/bash
LOGFILE="/some/log/directory/scriptLog.log"
(setsid /some/directory/shutdownHandler.sh "true" >$LOGFILE 2>&1 < /dev/null &)
exit 0

上面做了一些关键的事情:

  • 处理脚本的stdoutstderrstdinstdoutstderr 被定向到 LOGFILE 并将 dev/null 附加到 stdin
  • 与控制终端断开连接
  • Reparents 脚本初始化。 shutdownHandler.sh 不会与 JVM 位于同一进程树中

【讨论】:

    【解决方案2】:

    我建议你尝试以下简化:

    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 中断)。

    【讨论】:

      猜你喜欢
      • 2013-10-14
      • 2014-09-05
      • 1970-01-01
      • 2015-07-05
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多