gpt4 book ai didi

运行守护进程脚本的 Java Execute Bash 脚本

转载 作者:IT王子 更新时间:2023-10-29 00:43:34 24 4
gpt4 key购买 nike

我正在编写一个 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 有什么方法可以杀死守护进程脚本吗?

最佳答案

我建议您尝试以下简化:

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

关于运行守护进程脚本的 Java Execute Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46083848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com