温馨提示×

nohup日志为何突然消失

小樊
41
2026-08-20 10:26:33
栏目: 编程语言

nohup 日志突然消失通常不是“无缘无故”,而是被覆盖、重定向、轮转或进程退出导致的。下面按最常见 → 较少见的顺序给你排查思路。


一、最常见原因(90% 都在这里)

1️⃣ 日志被重定向覆盖(最常见)

如果你用了 > 而不是 >>

nohup java -jar app.jar > nohup.out 2>&1 &

问题:

  • 每次启动都会 清空 nohup.out
  • 日志看起来“突然消失”

✅ 正确写法(追加):

nohup java -jar app.jar >> nohup.out 2>&1 &

2️⃣ 进程重启 / 脚本重启

很多场景会自动重启进程

  • systemd
  • supervisor
  • cron
  • 自定义 while true 脚本

如果重启脚本里用了:

> nohup.out

日志就会被清空。

✅ 排查:

ps -ef | grep 进程名

3️⃣ nohup.out 被删除,但进程还在

很多新手会直接删日志:

rm nohup.out

结果:

  • 文件在磁盘上还存在(被进程占用)
  • ls 看不到
  • 磁盘空间还在占用

✅ 查看真实情况:

lsof | grep nohup.out

✅ 找回(不重启进程):

cp /proc/<pid>/fd/1 nohup_new.log

二、日志“看起来消失”的其他原因

4️⃣ 日志被日志框架接管

如果你用的是:

  • logback
  • log4j2
  • log4j

nohup.out 可能只保留启动日志,后面日志写到了:

logs/app.log

✅ 重点检查:

ls logs/

5️⃣ 日志被 logrotate 切走

如果系统配置了 logrotate

  • nohup.out 被重命名
  • 或压缩成 nohup.out.1.gz

✅ 检查:

ls -lh nohup.out*

6️⃣ 磁盘满了(日志写不进去)

磁盘满时:

  • 日志不再增长
  • 看起来像“消失”

✅ 检查:

df -h

7️⃣ 进程异常退出

nohup 不能保证进程不退出,只能保证:

  • 忽略 SIGHUP
  • 父 shell 退出后继续运行

如果进程崩了,日志自然停止。

✅ 查看退出原因:

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


如果你愿意,可以把:

  • 启动命令
  • 运行环境(CentOS / Ubuntu / Docker)
  • 是否用 Java / Python / Node

贴出来,我可以精准定位是哪一种情况

0