【问题标题】:Logs not being created when running jar on remote machine via SSH通过 SSH 在远程机器上运行 jar 时未创建日志
【发布时间】:2018-10-12 04:53:48
【问题描述】:

假设以下设置:

  • 机器A:用户A@
  • 机器B:用户B@

我想在机器 B 上运行我的 JAR:

当我这样运行它时:
java -jar myApplication.jar > /dev/null 2>&1 & 一切顺利,在我的 jar 文件旁边生成了日志。

当我从机器 A 通过 ssh 运行它时:
ssh userB@<ipB> "java -jar myApplication.jar > /dev/null 2>&1 &"

应用程序在机器 B 上启动,但没有生成日志文件。

顺便说一句,jar 是一个使用 logback 进行日志记录的常规 Spring Boot 应用程序。

【问题讨论】:

    标签: java spring-boot logging ssh


    【解决方案1】:

    好的,应用程序正在运行并且正在生成日志,但不是我预期的。

    在myApplication配置文件中,有一个属性
    logging.file=logs/myApplication.log

    当我通过 SSH 启动我的应用程序时,执行的文件夹是 /home/userB 而不是 /home/userB/deployment/build
    因此,日志不是在应用程序所在的同一文件夹中生成,而是在用户 B 的主文件夹中生成。

    修复是在启动应用程序之前将cd 指向特定文件夹。

    【讨论】:

      【解决方案2】:

      您的应用程序在有机会创建日志文件之前就被杀死了。如果您从命令中删除最后一个&符号,它可能会起作用:

      ssh userB@<ipB> "java -jar myApplication.jar > /dev/null 2>&1"
      

      在出现 & 符号的情况下,命令被置于后台。由于 ssh 进程创建的 shell 没有前台作业,它会立即关闭连接。当连接关闭时,机器 B 会终止该命令的所有子进程,包括 Java 应用程序。

      您也可以使用nohup 来分离java 进程,这样它就不会在ssh 连接关闭时被杀死。这还有一个额外的好处,即即使您的连接中断,应用程序也将继续运行:

      ssh userB@<ipB> "nohup java -jar myApplication.jar > /dev/null 2>&1 < /dev/null &"
      

      查看screentmux 也会对您有所帮助。

      【讨论】:

      • 我已经尝试过了,现在再次检查我是否没有遗漏任何内容,但没有生成日志。并且应用程序正在运行,好吧。我可以轻松使用它的 REST 接口,只是没有创建日志。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 2011-09-25
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      相关资源
      最近更新 更多