1

如何在 Linux 中自动重启可运行的 jar 文件。

我在一个单独的屏幕中在 linux VPS 中运行 jar,但由于 OUTOFMEMORYERROR Java 堆空间,它会在一段时间后停止。

4

3 回答 3

0

您是否尝试过为jvm分配更多内存?如果问题仍然存在,那么您可以关联关闭挂钩,但没有保证它将始终执行。您可以从中调用其他进程,这将在一段时间后再次启动您的程序

于 2012-08-31T11:41:46.620 回答
0

编写一个简单的启动器,它会在应用程序关闭后重新启动。像这样的东西:

#!/bin/sh

TEMPFILE=`mktemp`
while true ; do
  echo "`date` Starting application" >> $TEMPFILE
  java -XX:OnOutOfMemoryError="kill -9 %p" -jar application.jar
  sleep 5
done

为了确保虚拟机正确完成,您可能需要在主循环周围考虑以下内容:

try {
    // main loop
    businessLogic();
} catch (OutOfMemoryError E) {
    System.exit(1);
}

编辑:我个人成功地使用Java Service Wrapper重新启动了一个不时失败的 apache tomcat,它在应用程序重新部署过多后遭受内存泄漏。你可能想看看它,它非常简单。

于 2012-08-31T11:46:12.087 回答
0

试试这个:-XX:OnOutOfMemoryError="<cmd args>; <cmd args>" 编写一个shell脚本来“kill -TERM pid”,然后再次启动它并将脚本放入cmd命令行选项的一部分。差不多就是这样,但您需要知道进程的 pid(或依赖 killall 或 ps 等)

您还可以使用monit定期检查应用程序是否正在运行。这些或多或少是标准解决方案。我自己使用监控守护程序在内存不足时通过电子邮件/短信通知,以便可以进行适当的检查以及是否存在要修复的泄漏。当你有几十 GB 的时候,直接转储堆很糟糕。

于 2012-08-31T11:55:10.487 回答