nohup 日志突然消失通常不是“无缘无故”,而是被覆盖、重定向、轮转或进程退出导致的。下面按最常见 → 较少见的顺序给你排查思路。
如果你用了 > 而不是 >>:
nohup java -jar app.jar > nohup.out 2>&1 &
问题:
✅ 正确写法(追加):
nohup java -jar app.jar >> nohup.out 2>&1 &
很多场景会自动重启进程:
systemdsupervisorcronwhile true 脚本如果重启脚本里用了:
> nohup.out
日志就会被清空。
✅ 排查:
ps -ef | grep 进程名
很多新手会直接删日志:
rm nohup.out
结果:
ls 看不到✅ 查看真实情况:
lsof | grep nohup.out
✅ 找回(不重启进程):
cp /proc/<pid>/fd/1 nohup_new.log
如果你用的是:
logbacklog4j2log4jnohup.out 可能只保留启动日志,后面日志写到了:
logs/app.log
✅ 重点检查:
ls logs/
如果系统配置了 logrotate:
nohup.out 被重命名nohup.out.1.gz✅ 检查:
ls -lh nohup.out*
磁盘满时:
✅ 检查:
df -h
nohup 不能保证进程不退出,只能保证:
如果进程崩了,日志自然停止。
✅ 查看退出原因:
dmesg | tail
journalctl -xe
你可以按顺序查:
# 1. 进程还在吗
ps -ef | grep xxx
# 2. 文件真的没了?
ls -lh nohup.out*
# 3. 是否被删除但占用
lsof | grep nohup.out
# 4. 磁盘满了吗
df -h
# 5. 是否被重定向覆盖
history | grep nohup
✅ 不要用 nohup.out 当正式日志
nohup java -jar app.jar >> logs/app.log 2>&1 &
✅ 或用 systemd(强烈推荐)
StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app.log
✅ 或 supervisor / docker
如果你愿意,可以把:
贴出来,我可以精准定位是哪一种情况。