温馨提示×

为什么nohup日志停止写入

小樊
47
2026-10-09 10:23:17
栏目: 编程语言

nohup 日志停止写入,通常不是 nohup 本身的问题,而是程序、输出缓冲、文件句柄或运行环境发生了变化。常见原因和排查思路如下:


一、最常见原因

1. 程序已经退出或卡死

  • 进程其实已经结束
  • 或进程阻塞(死锁、等待输入、网络卡住)

排查:

ps -ef | grep 你的程序

或

jobs -l

2. 标准输出被缓冲(非常常见)

很多程序(尤其是 Python、Java、C++)不是实时写磁盘:

  • Python 默认有缓冲
  • 日志在内存里,没刷到文件

表现:

  • 程序还在跑
  • 但 nohup.out 很久不更新

解决:

  • Python:
python -u app.py

或

print(..., flush=True)
  • C/C++:
fflush(stdout);

3. 日志写到了别的地方

程序可能:

  • 改写了 log 路径
  • 使用了日志框架(log4j / logging / logback)

检查:

lsof -p 进程PID

看 cwd 和打开的文件


4. nohup.out 被移动 / 删除 / 改名

如果你做过:

mv nohup.out nohup.out.bak

或

rm nohup.out

结果:

  • 进程仍持有旧文件句柄
  • 新日志“写进黑洞”

验证:

ls -l /proc/进程PID/fd

解决:

  • 不要直接删,用:
> nohup.out

(清空,而不是删除)


5. 磁盘满了 / 只读

df -h
touch nohup.out

6. 输出被重定向到 /dev/null

启动命令可能是:

nohup xxx > /dev/null 2>&1 &

7. 终端 / SSH 断开导致子进程异常

虽然 nohup 本应防止,但:

  • 子进程仍在依赖 terminal
  • 某些 shell 配置异常

二、推荐的正确用法

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

或更好的方式(生产推荐):

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

三、快速自检清单

✅ 进程是否还在
✅ 是否使用了 -u / 无缓冲
✅ nohup.out 是否被删/移
✅ 磁盘是否满
✅ 日志是否写到了别的文件


如果你愿意,可以把:

  • 启动命令
  • 程序语言
  • ps / lsof 输出

发出来,我可以帮你精确定位。

0 踩