当 Install4J 的 unix 启动器以 SIGTERM 或 SIGINT 终止时,应用程序继续运行



我们使用 Install4J 创建了一个安装程序。现在我想使用 docker 和 supervisor 运行我们的应用程序。一切都运行良好,除了当我与主管停止进程时,只有启动器被终止。启动器启动的进程继续运行。我可以定义主管发送到启动器的信号。我尝试了SIGTERM和SIGINT,但仍然只有启动器被终止,而不是应用程序的进程。启动器可以处理该设置还是我必须使用 java 自行调用我们的应用程序?

尝试添加

pid = $!
trap 'kill $pid; exit 1' HUP INT QUIT TERM

在启动器脚本中进行 Java 调用之后。

好吧,启动器脚本实际上在 java 调用时阻塞。所以在那之后的陷阱已经太晚了。我现在让它工作,但我对它并不完全满意:

trap 'kill -TERM $child' TERM
exec $INSTALL4J_JAVA_PREFIX "$app_java_home/bin/java" -Dinstall4j.jvmDir="$app_java_home" -Dexe4j.moduleName="$prg_dir/$progname" "-Dinstall4j.launcherId=181" "-Dinstall4j.swt=false" "$vmov_1" "$vmov_2" "$vmov_3" "$vmov_4" "$vmov_5" $INSTALL4J_ADD_VM_PARAMS -classpath "$local_classpath" com.install4j.runtime.launcher.UnixLauncher launch 17e8376b "$prg_dir/../log/error.log" "" GuiStart  "$@"
child=$!
wait $child
exit $?

所以我首先设置陷阱,然后使用 exec 运行 java 调用,这样它就不会阻塞,然后我等待 java 结束退出。

恕我直言,它远非完美,但它现在有效。

更新:现在它工作正常。我不得不将"exec"定义为"INSTALL4J_JAVA_PREFIX":

INSTALL4J_JAVA_PREFIX="exec"

默认情况下,将为其分配一个空字符串。使用"exec",它可以按预期工作。

最新更新