You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过SSH在远程机器运行Spring Boot Jar时日志未生成

解决SSH远程启动Spring Boot JAR后日志不生成的问题

嘿,这个问题我之前帮朋友排查过,其实核心是SSH远程执行后台命令时的会话环境和本地终端不一样,导致Spring Boot的日志框架找不到正确的输出路径。让我给你拆解一下原因和解决办法:

问题根源分析

  • 当你在MachineB本地执行java -jar myApplication.jar > /dev/null 2>&1 &时,进程是在当前终端会话的后台运行,工作目录就是你执行命令的目录,Spring Boot的日志框架(比如Logback、SLF4J)默认会在这个目录下生成日志文件,所以一切正常。
  • 但通过SSH远程执行时,即使加了&让进程后台运行,有两个关键问题:
    1. SSH远程命令默认的工作目录是用户userB的家目录(比如/home/userB),而不是JAR包所在的目录,日志框架找不到配置里的输出路径,自然生成不了日志;
    2. SSH会话结束时会给后台进程发送SIGHUP信号,虽然你的进程没被终止,但会话相关的标准流绑定被回收,也可能影响日志的输出逻辑。

具体解决方案

方案1:切换到JAR所在目录再启动

执行远程命令时,先通过cd切换到JAR包的绝对路径,再启动应用,确保工作目录和本地执行一致:

ssh userB@<ipB> "cd /绝对路径/到/JAR包目录 && java -jar myApplication.jar > /dev/null 2>&1 &"

这个方法能直接解决工作目录不匹配的问题,日志框架会在正确的目录下生成日志文件。

方案2:用nohup脱离SSH会话控制

nohup可以让进程脱离当前SSH会话的控制,即使你关闭SSH连接,进程也能稳定运行,同时避免会话回收带来的流绑定问题:

ssh userB@<ipB> "cd /绝对路径/到/JAR包目录 && nohup java -jar myApplication.jar > /dev/null 2>&1 &"

默认情况下nohup会把输出写到nohup.out,但你已经重定向到/dev/null了,不影响Spring Boot自身的日志生成,重点是它能让进程完全独立于SSH会话。

方案3:在Spring Boot配置中指定日志绝对路径

如果不想依赖工作目录,可以直接在Spring Boot的配置文件里指定日志文件的绝对路径,一劳永逸:

  • 如果你用application.properties:
    logging.file.name=/var/log/myApplication.log
    
  • 如果你用application.yml:
    logging:
      file:
        name: /var/log/myApplication.log
    
  • 要是用Logback的XML配置,直接在logback.xml里修改文件输出路径:
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>/var/log/myApplication.log</file>
        <!-- 其他日志格式、滚动策略等配置 -->
    </appender>
    

这样不管进程在哪个工作目录运行,日志都会写到你指定的绝对路径下。

验证小技巧

  • 先远程执行命令后不要关闭SSH会话,看看日志是否生成:如果生成了,说明是会话关闭导致的问题,用nohup解决;
  • 如果不关闭会话也不生成日志,那肯定是工作目录不对,用方案1切换目录即可。

内容的提问来源于stack exchange,提问作者ioreskovic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:16:48