温馨提示×

nohup日志为何不更新

小樊
45
2026-07-10 01:00:55
栏目: 编程语言

nohup 日志不更新,通常不是 nohup 本身的问题,而是输出缓冲/重定向/进程状态导致的。下面按最常见原因给你排查思路。


一、最常见原因:标准输出被缓冲(90% 的情况)

现象

  • 程序在跑
  • nohup.out 文件存在
  • tail -f nohup.out 很久没变化

原因

很多程序(尤其是 Python、Java、C/C++)默认会缓冲 stdout,而不是实时写文件。

例如 Python:

nohup python app.py &

stdout 是块缓冲,只有缓冲区满或程序退出才写文件。

✅ 解决方案

✅ 1. Python:禁用缓冲

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

或:

PYTHONUNBUFFERED=1 nohup python app.py &

✅ 2. 强制刷新(代码层)

print("xxx", flush=True)

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

检查

ls -l nohup.out
lsof -p <pid> | grep -E '1w|2w'

可能情况:

  • 程序内部又把日志写到了别的文件
  • 使用了 logging / log4j / logback 等日志框架

✅ 确认程序真正写的是哪个 fd


三、程序其实已经退出或异常

检查进程

ps -ef | grep your_program

检查 nohup.out 末尾

tail -n 50 nohup.out

常见情况:

  • 启动即报错
  • 端口被占用
  • 依赖缺失
  • 日志只写了一次就退出了

四、nohup.out 不是你以为的那个

可能情况

  • 你在不同目录执行了多次 nohup
  • 实际日志在另一个目录

查找 nohup.out

find / -name nohup.out 2>/dev/null

五、磁盘 / inode / 文件系统问题

检查

df -h
df -i

现象

  • 文件大小不增长
  • 但进程还在

六、输出被丢弃(2>&1 没加)

错误示例

nohup python app.py > nohup.out &

如果程序输出到 stderr,你看不到。

✅ 正确写法

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

七、程序是 daemon / 自己 fork 了

有些程序:

  • 启动后 fork
  • 父进程退出
  • 子进程关闭了 stdout/stderr

这时 nohup.out 不会再更新。

✅ 用:

strace -p <pid> -e write

确认是否真的在写。


快速自检清单 ✅

你可以按顺序执行:

# 1. 进程还在吗
ps -ef | grep your_program

# 2. 文件在增长吗
ls -l nohup.out

# 3. 是不是缓冲问题
python -u 或 flush

# 4. 是不是写到别的地方
lsof -p <pid>

一句话总结

nohup 日志不更新,90% 是因为 stdout 缓冲,不是 nohup 的问题。

如果你愿意,可以把:

  • 启动命令
  • 程序语言(Python / Java / C++)
  • tail -f nohup.out 的现象

贴出来,我可以直接帮你定位是哪一条。

0