从 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 进程的标准输入和输出通常是个好主意。
我有一个 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 进程的标准输入和输出通常是个好主意。