nohup.out 是 nohup 命令重定向 stdout/stderr 生成的裸输出文件,无日志级别、时间戳和滚动能力;应通过 logrotate 切割(推荐)、cronolog 接管或直接使用 Spring Boot Logback 配置接管日志输出。

nohup.out 不是 Spring Boot 自己生成的日志文件,而是 Linux 的 nohup 命令把 stdout/stderr 重定向后写入的“裸输出流”。它不带日志级别、时间戳、线程信息,也没有内置滚动能力——所以不能靠 Spring Boot 的 logback-spring.xml 或 logging.* 配置直接控制它。真正要切的,是「谁在往这个文件里写」以及「怎么接管写入过程」。
用 logrotate 每天自动切割 nohup.out(推荐,最稳)
logrotate 是系统级工具,不依赖 Java 进程状态,也不需要改启动命令,适合生产环境长期运行的后台服务。
- 它通过
copytruncate实现“复制+清空”,进程继续往原文件写,不会丢日志 - 支持压缩、保留天数、日期后缀、空文件跳过等关键行为
操作步骤:
- 新建配置文件:
/etc/logrotate.d/my-springboot-app - 填入以下内容(注意替换
/path/to/nohup.out为实际路径):
/path/to/nohup.out {
daily
missingok
rotate 30
compress
delaycompress
notifempty
copytruncate
dateext
dateformat -%Y%m%d
}验证是否生效:
- 手动触发一次:
sudo logrotate -f /etc/logrotate.d/my-springboot-app - 检查是否生成了类似
nohup.out-20260908的文件,并且原nohup.out变为空
常见坑:
- 路径写错或权限不足(
logrotate以 root 运行,但需确保它有读写nohup.out所在目录的权限) - 忘记加
copytruncate:不加会导致切割后进程继续写原文件,但文件 inode 已被 mv 走,实际日志会丢失 -
dateformat中不能用%H等小时字段:因为daily模式只认日期,用小时会报错
启动时用 cronolog 接管 stdout(简单但有风险)
如果你能改启动命令,cronolog 是最轻量的按时间切分方案:
典型命令:
nohup java -jar app.jar | /usr/local/bin/cronolog ./nohup-%Y-%m-%d.log &
它会实时把 stdout 按模板生成新文件,比如 nohup-2026-09-08.log。
但要注意:
- Java 进程崩溃或
System.exit()时,cronolog可能来不及 flush 缓存,末尾几行日志丢失 - 某些 JVM 参数(如
-XX:+UseContainerSupport)或容器环境里,管道行为不稳定,出现“日志突然中断”现象(知识库中提到过) - 必须确保
cronolog已安装:which cronolog,否则整个命令静默失败
改用标准日志框架接管输出(一劳永逸)
真正想摆脱 nohup.out,就别让它存在——让 Spring Boot 自己管日志。
做法很简单:
- 删掉
nohup,改用重定向到 Spring Boot 配置的日志文件:
java -jar app.jar --logging.file.name=./logs/app.log
或者更推荐:在 application.yml 里配好:
logging:
file:
name: ./logs/app.log
logback:
rollingpolicy:
max-file-size: 10MB
max-history: 30这样所有日志走 Logback,支持按大小+时间双策略滚动,nohup.out 根本不会产生。
关键点:
- 必须去掉
nohup和&,否则 shell 仍会创建nohup.out(哪怕你重定向了 stdout) - 如果必须后台运行,用
systemd或screen,而不是nohup - Spring Boot 2.4+ 默认不启用
logback-spring.xml自动加载,确认配置文件名和位置正确(resources/下)
临时清理 or 手动切割(应急用)
运维排查时发现 nohup.out 已达 5GB,又不能重启,只能先腾空间:
安全清空(不中断进程):
cat /dev/null > nohup.out
这利用了 Linux 文件描述符机制:进程打开的是 inode,不是文件名,清空不影响写入。
如果还想留个备份再清空:
- 先复制:
cp nohup.out nohup.out.$(date +%Y%m%d_%H%M) - 再清空:
cat /dev/null > nohup.out
注意:
- 不要用
rm nohup.out && touch nohup.out:这会改变 inode,正在写的进程会继续往已删除的文件写,新文件无人写入 - 不要用
truncate -s 0 nohup.out:效果同cat /dev/null > ...,但部分旧系统不支持truncate
真正的难点不在“怎么切”,而在于“谁在写”和“能不能换接管方式”。logrotate 是兜底方案,Logback 是根治方案,其它都是权衡取舍。

















