当前位置: 首页 > 知识库问答 >
问题:

如何始终运行Java控制台应用程序?

景元忠
2023-03-14

我有一台服务器(Ubuntu 14.04.4 LTS),并希望某个Java应用程序一直在其上运行。目前我使用nohup gradle运行启动它

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 代码以记录内存转储,以防出现内存不足错误。

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个答案

松俊美
2023-03-14

首先,您应该尝试在应用程序中找到并解决内存不足问题。

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

ps aux 

或者任何其他适合你的方式。

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

现在设置一个每隔几分钟运行一次此脚本的 cron。类似的东西

*/10 * * * * /your/script

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

端木令
2023-03-14

如注释中所述,这是内存不足异常,您可以执行以下操作:

重新检索代码,可能会导致代码性能低下。

如果您正在运行一个简单的“java应用程序”,您可以点击“运行方式”..Java应用程序“点击”运行方式..运行配置”,选择您的java应用程序,并在选项卡“参数”、“虚拟机参数”中添加以下参数:

-Xmx1024m -Xms512m 

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

鲍宁
2023-03-14
匿名用户

>

  • 基本上,这不是一个好的做法。您应该避免使用构建工具,并在运行之前将其打包到可执行JAR中。如果您出于某种原因需要在启动期间解决工件,请查看Capsule项目和Gradle Capsule插件。

    格拉德3号。默认情况下使用守护程序。如果它已经闲置了3个小时或更长时间,Gradle将杀死守护进程。我不确定这是不是原因,但是您可以尝试从< code> - no-daemon参数开始。

  •  类似资料:
    • 我有一个 .NET Core 控制台应用程序并运行了 。但是,我不知道如何从命令行运行应用程序。有什么提示吗?

    • 我试图在中运行控制台应用程序,但出现错误。 异常“yii\base\UnknownPropertyException”,在F:\xampp\htdocs\mdc\vendor\yiisoft\yii2\base\Component中显示消息“设置未知属性:yii\console\Response::formatters”。菲律宾比索:209 Common\config\main本地。php Cro

    • 问题内容: 我已经开发了一个Java控制台应用程序,该应用程序在启动时打开控制台窗口并保持在前台,我想在后台启动该应用程序。 现在,我通过以下命令行启动该应用程序: 有没有办法实现这种行为?更改命令行参数就足够了,还是我需要对代码进行一些更改? 问题答案: 答案取决于操作系统。

    • 问题内容: 我通过SSH连接到远程服务器。然后,我使用Forever启动我的node.js应用程序。一切正常,直到关闭控制台窗口。即使通过ssh关闭连接,如何在远程服务器上永远运行node.js应用程序?我只想启动一个应用程序,然后关闭计算机。我的应用程序应在远程服务器的后台运行。 问题答案: 您可能还需要考虑使用upstart实用程序。它将允许您像服务一样启动,停止和重新启动节点应用程序。可以将

    • 我有maven项目,我正在尝试使用Commons cli库来处理输入数据: 我在Intellij Idea中设置参数:-iinputs.zip-ooutput.zip它可以工作,但是我应该在控制台中使用什么命令? 我试过:java-jar NewMyZip-1。jar-i输入。zip-o输出。zip得到了一个例外: 有人知道问题是什么以及如何解决吗?

    • 问题内容: 有什么办法可以使可执行文件.jar双击后打开命令行? 我正在制作一个基于文本的冒险游戏。截至目前,它只是带有房间的迷宫。最终它将变得更大,更深入,但是现在我只想了解基本结构。无论如何,要完成这项工作,我一直在从System.out.printf命令和java.util.Scanner获取输出和输入。到目前为止,所有功能都运行良好,但是当我尝试将其发送给不知道如何或者不想从命令行运行程序