温馨提示×

nohup日志为何丢失

小樊
44
2026-07-10 01:05:47
栏目: 编程语言

nohup 日志丢失通常不是 nohup 把日志“删了”,而是输出目标、重定向方式或程序行为出了问题。下面按最常见原因逐一说明,并给出对应解决方案。


一、最常见原因

1️⃣ 没有重定向输出(默认写到 nohup.out

nohup ./app
  • 默认只写 当前目录nohup.out
  • 如果:
    • 当前目录不可写
    • 或程序在别的目录启动
    • nohup.out 被删除 / 覆盖
  • 日志就会“消失”

建议做法

nohup ./app > app.log 2>&1 &

2️⃣ 程序输出被缓冲(最容易误以为丢失)

  • Python / Java / C++ 等程序默认带缓冲
  • 日志并不会立刻写入文件
  • 看起来像是“没日志”

解决方法

Python

nohup python -u app.py > app.log 2>&1 &

print("xxx", flush=True)

Java

nohup java -Djava.util.logging.config.file=logging.properties ...

3️⃣ 日志被写到了 stderr,但没重定向

nohup ./app > app.log &

✅ stdout 在 app.log
❌ stderr 可能:

  • 不见了
  • 或写到了 nohup.out

正确写法

nohup ./app > app.log 2>&1 &

4️⃣ 日志文件被删除,但进程还在运行

rm app.log
  • 进程仍持有文件句柄
  • ls 看不到文件
  • 实际上日志还在磁盘中

✅ 检查:

lsof -p PID

✅ 恢复(如 inode 还在):

cp /proc/PID/fd/3 app.log

5️⃣ 程序自己改写了日志路径

  • 程序内部:
    • 重写了 stdout
    • 使用 log4j / logback / logging
  • nohup 根本没用到

✅ 检查:

ps -fp PID

或直接看程序配置


6️⃣ nohup 被覆盖 / 重新启动

nohup ./app > app.log
nohup ./app > app.log
  • 第二次会 覆盖 日志(不是追加)

✅ 用追加模式:

nohup ./app >> app.log 2>&1 &

7️⃣ 磁盘满 / inode 满

df -h
df -i
  • 日志写不进去
  • 不会报错,但内容丢失

二、推荐的“稳妥写法”(生产环境)

✅ 标准写法

nohup ./app >> app.log 2>&1 &

✅ 带日期 + 自动轮转(推荐)

nohup ./app >> app_$(date +%Y%m%d).log 2>&1 &

或使用:

  • logrotate
  • systemd
  • supervisor

三、快速自检清单 ✅

  • [ ] 是否显式重定向了 stdout + stderr?
  • [ ] 程序是否使用了输出缓冲?
  • [ ] 是否误删了日志文件?
  • [ ] 是否有多个进程覆盖同一日志?
  • [ ] 磁盘 / inode 是否满?
  • [ ] 程序是否自己管理日志?

如果你愿意,可以贴出:

  • 启动命令
  • 程序语言(Python / Java / C++)
  • 是否使用日志框架

我可以帮你精确判断是哪一种情况

0