温馨提示×

为何nohup日志停止写入

小樊
61
2026-09-12 09:59:35
栏目: 编程语言

nohup 日志停止写入,通常不是 nohup 本身的问题,而是进程、输出缓冲、文件系统或重定向方式导致的。下面按常见原因逐一说明,并给出排查方法。


一、最常见原因:标准输出被缓冲(尤其是 Python / Java)

很多程序在标准输出不是终端时,会启用全缓冲(block buffering),而不是行缓冲。

现象

  • 程序在跑
  • 但 nohup.out 很久不更新
  • 程序退出后,日志突然“一次性”写入

典型场景

nohup python app.py > nohup.out 2>&1 &

Python 在管道/文件下默认是块缓冲。

解决方式

Python

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

或代码里:

print(x, flush=True)

Java

nohup java -Djava.io.tmpdir=/tmp App > nohup.out 2>&1 &

Java 也有类似缓冲问题,可加日志框架或 System.out.flush()


二、程序已经“卡住”或进入死循环

日志不写 ≠ 日志丢了,可能是程序没产生新日志。

排查

ps -ef | grep 程序名
top -p PID
strace -p PID

如果 CPU 为 0、无系统调用,通常是:

  • 等待数据库
  • 等待网络
  • 死锁

三、日志被重定向到了别的地方

常见错误写法:

nohup ./app.sh &
# 但又在某处写了
./app.sh > other.log

或者:

  • 程序内部重新打开了日志文件
  • 使用了 logging 框架(log4j / logback / logging)

检查

ls -l /proc/PID/fd

看 1 和 2 指向哪里。


四、磁盘或 inode 满了

检查

df -h
df -i

如果磁盘满:

  • 日志停止写入
  • 程序可能仍在运行

五、nohup.out 被删除了(但进程还活着)

rm nohup.out

进程仍然持有文件句柄,日志还在写,但你看不到文件。

解决

ls -l /proc/PID/fd

找到被删文件,copy 出来:

cp /proc/PID/fd/1 recovered.log

或重启进程。


六、标准错误没重定向

nohup ./app.sh > nohup.out &

错误日志可能跑到终端或丢失。

推荐写法

nohup ./app.sh > nohup.out 2>&1 &

七、用了 setsid / disown / screen 导致混淆

有时混用:

nohup setsid ./app &

日志行为可能不一致。


八、推荐更稳妥的日志方式

用 tee

nohup ./app | tee -a nohup.out 2>&1 &

或用 systemd(生产环境)

StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app.err

快速自查清单 ✅

  • [ ] 是否使用 -u(Python)或关闭缓冲
  • [ ] 进程是否还活着
  • [ ] /proc/PID/fd 指向哪
  • [ ] 磁盘 / inode 是否满
  • [ ] 是否误删日志文件
  • [ ] 是否重定向了 stderr

如果你愿意,可以贴出:

  • 启动命令
  • 程序语言
  • ps / ls -l /proc/PID/fd 输出

我可以直接帮你定位是哪一类问题。

0 踩