• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

java 来源:DP_ 9次浏览

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

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):在OutOfMemoryError的情况下,我修改了Gradle代码以记录内存转储。

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] 


===========解决方案如下:

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

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


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)