温馨提示×

nohup日志不更新是什么原因

小樊
54
2026-07-21 17:22:42
栏目: 编程语言

nohup 日志不更新,通常不是 nohup 本身的问题,而是输出缓冲、程序状态或文件指向导致的。下面按常见原因从高到低给你排查思路。


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

现象

  • 程序仍在运行
  • nohup.out 文件大小不变化
  • 但程序内部其实在打印日志

原因

很多语言(尤其是 Python、C/C++)在输出不是终端时会启用块缓冲,而不是行缓冲。

验证

# 查看程序是否还在运行
ps -ef | grep your_program

# 查看文件是否被打开
lsof nohup.out

解决方案

✅ 方法 1:强制刷新缓冲(推荐)

Python 示例

print("xxx", flush=True)

或启动时:

python -u your_script.py

C / C++

fflush(stdout);
setbuf(stdout, NULL);

✅ 方法 2:使用 stdbuf(通用)

nohup stdbuf -o0 ./your_program > nohup.out 2>&1 &

nohup stdbuf -oL ./your_program > nohup.out 2>&1 &

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

现象

  • nohup.out 不更新
  • 但磁盘空间在变
  • 或程序里有自己的日志配置

常见情况

  • 程序里写了:
    logging.basicConfig(filename='app.log')
    
  • Docker / systemd / supervisor 接管了输出
  • 程序 fork 后关闭了 stdout

排查

lsof -p <pid> | grep log

确认程序实际写的是哪个文件。


三、程序卡住或死循环(假死)

现象

  • CPU 0%
  • 程序不退出也不输出

排查

top -p <pid>
strace -p <pid>

如果 strace 没输出,程序可能:

  • 阻塞在 IO
  • 死锁
  • 等待网络 / 数据库

四、nohup.out 被删除或替换

现象

  • nohup.out 不更新
  • df -h 显示磁盘没释放

原因

  • 文件被 rm 删除,但进程仍持有 fd

验证

lsof | grep deleted

解决

# 重新打开日志
touch nohup.out

或重启程序(最稳妥)


五、输出被重定向到 /dev/null

检查启动命令

nohup ./app >/dev/null 2>&1 &

这种情况日志本来就不会写。


六、磁盘满或只读

排查

df -h
mount | grep "read-only"

七、推荐的正确用法(避免踩坑)

✅ 推荐写法

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

或带缓冲控制:

nohup stdbuf -oL ./your_program > app.log 2>&1 &

快速自检清单 ✅

✔ 程序是否还在运行
✔ 输出是否被缓冲
✔ 日志是否写到别的文件
✔ 是否删除了 nohup.out
✔ 程序是否卡死


如果你愿意,可以把:

  • 启动命令
  • 程序语言(Python / Java / C++)
  • ps -ef | grep xxx 输出

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

0