如何一直运行Java控制台应用程序?

时间:2016-11-25 11:09:31

标签: java linux gradle ubuntu-14.04 daemon

我有一台服务器(Ubuntu 14.04.4 LTS),并希望一直运行某个Java应用程序。目前我使用nohup gradle run &启动它。昨天它停止了工作。 nohup.out显示以下错误消息:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':run'.
> Process 'command '/usr/lib/jvm/java-8-oracle/bin/java'' finished with non-zero exit value 137

我如何更改我的Java应用程序以防止将来出现此类错误(确保应用程序一直运行,并且 - 理想情况下 - 如果崩溃则会自动重启)?我正在寻找简单,最小的解决方案。

请注意,之前我在此特定公司的服务器上遇到过类似的问题。我有一个带有Web应用程序的Apache服务器,有时它会停止工作,没有明显的原因(也许服务器由于活动不足而无法入睡)。

更新1(27.01.2017 12:30 MSK):我修改了Gradle代码,以便在OutOfMemoryError的情况下记录内存转储。

run {
    jvmArgs = ["-Xmx100m", "-XX:+HeapDumpOnOutOfMemoryError", "-XX:HeapDumpPath=/home/dp/dev/myprod/log/memdump.log"]
}

当我运行Gradle脚本时,我在输出中看到以下消息,从中我得出结论,内存转储参数定义正确。

09:33:47.031 [INFO] [org.gradle.process.internal.DefaultExecHandle] Starting process 'command '/usr/lib/jvm/java-8-oracle/bin/java''. Working directory: /home/dp/dev/myprod Command: /usr/lib/jvm/java-8-oracle/bin/java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/dp/dev/myprod/log/memdump.log [...] com.mycompany.myprod.AppKt

应用程序崩溃后,我看不到文件/home/dp/dev/myprod/log/memdump.log。目录/home/dp/dev/myprod/log/存在,并且可以由启动应用程序的用户访问。

我使用nohup gradle --full-stacktrace --stacktrace --debug run &启动应用程序,但它无法获得有关问题原因的任何有意义的信息。

以下是我得到的例外情况:

06:29:16.179 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Caused by: org.gradle.process.internal.ExecException: Process 'command '/usr/lib/jvm/java-8-oracle/bin/java'' finished with non-zero exit value 137
06:29:16.180 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:369)
06:29:16.186 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.process.internal.DefaultJavaExecAction.execute(DefaultJavaExecAction.java:31)
06:29:16.186 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.tasks.JavaExec.exec(JavaExec.java:74)
06:29:16.186 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
06:29:16.186 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:136)
06:29:16.187 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:129)
06:29:16.187 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:118)
06:29:16.187 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:623)
06:29:16.187 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:606)
06:29:16.187 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
06:29:16.188 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
06:29:16.194 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   ... 68 more
06:29:16.205 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 

3 个答案:

答案 0 :(得分:1)

  1. 基本上,这不是一个好习惯。您应该避免使用构建工具,并在运行之前将其打包到可执行的JAR中。如果由于某种原因需要在启动期间解决工件问题,请查看fullcalendarCapsule project

  2. Gradle 3. +默认使用守护进程。如果它已经闲置了3个小时或更长时间,Gradle会杀死守护进程。我不确定这是原因,但您可以尝试从--no-daemon参数开始。

答案 1 :(得分:0)

正如评论中所述,这是一个内存异常,您可以这样做:

重新编写代码,也许您的代码可能性能较低。

如果你正在运行一个简单的“java应用程序”,你可以点击“Run As .. Java Application”,点击“Run As .. Run Configration”,选择你的java应用程序并在TAB“Arguments”,“VM Arguments”中“添加此参数:

-Xmx1024m -Xms512m 

使用此参数,您的应用程序(在开始时)至少分配512M,最大为1024M。您可以根据需要放大这些数字。

答案 2 :(得分:0)

首先,您应该尝试在应用程序中查找并解决Out Of Memory问题。

要设置监视,您可以编写一个简单的脚本来检查您的应用程序是否正在运行。 检查应用程序是否正在侦听指定端口或使用

进行检查
lodash

或任何其他适合您的方式。

如果应用程序已关闭,请重新启动它。

现在设置一个每隔几分钟运行一次这个脚本的cron。

之类的东西
ps aux 

这将每10分钟运行一次脚本。