我有一臺服務器(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]
137內存不足。你可能有內存泄漏 –
你也可能在你的標題上工作 –
你把它作爲一個簡單的「java應用程序」運行嗎?或者你運行在像tomcat這樣的服務器上?你在用詹金斯嗎? – RudiDudi