从 shell 到 运行 java 进程/jar 的双叉

Double fork from shell to run java process / jar

我有一个 Java 应用程序需要生成另一个 Java 应用程序。第二个 java 应用程序寿命很长,可能比原来的 java 应用程序寿命更长。它基本上是一个执行一些网络代码的大 while 循环,除非特定情况发生,否则不会终止。要启动此应用程序,我使用 bash 脚本对其进行双重分叉,这样原始 java 应用程序就不会等待它完成:

原始 java 应用如何启动 shell 脚本:

ProcessBuilder processBuilder = new ProcessBuilder(
    "myshellscript",
    "-a", "somearg",
    "-b", "anotherarg");

final Process process = processBuilder.start();
process.waitFor();
if (process.exitValue() != 0)
{
  // do something
}

shell脚本内容:

fork() {
   echo "Going to fork" >> /tmp/output.log
   (setsid java -jar ./anotherapplication.jar "$@" &);
   echo "Exited" >> /tmp/output.log
}
fork "$@"

在 "output.log" 中,我看到了 "Going to fork" 和 "Exited" 消息,但我从未看到来自 "anotherapplication.jar" 应用程序的任何日志,这让我觉得它没有启动成功。它也没有显示在 ps aux 的输出中,所以它肯定不是 运行。这是启动第二个应用程序的正确方法,还是我没有正确启动它?

Setsid 应该做你想做的。我不知道为什么你的应用程序没有启动,但应用程序不会向 /tmp/output.log 打印任何内容,只是因为你没有将 setsid 行的输出重定向到日志文件。我会将该行的 stdout 和 stderr 重定向到 output.log 使用:

(setsid java -jar ./anotherapplication.jar "$@" &) >>/tmp/output.log 2&>1

这几乎肯定会显示一个错误,记录无法启动的原因。像这样重置 daemon-like 进程的标准输入和输出通常是个好主意。