温馨提示×

为何nohup日志为空文件

小樊
42
2026-09-03 10:32:57
栏目: 编程语言

nohup 日志为空,通常不是 nohup 本身的问题,而是程序输出方式或启动方式导致的。下面按常见原因逐一说明。


1️⃣ 程序根本没产生输出

最常见原因。

  • 程序正常运行,但没有向 stdout / stderr 打印任何内容
  • 例如:
    • 只写日志到文件
    • 只在出错时才输出
    • 是后台服务(daemon)

✅ 验证:

echo "test" >> nohup.out

如果这样能写进去,说明文件本身没问题。


2️⃣ 输出被重定向到了别的地方

你以为在 nohup.out,其实不在。

常见写法:

nohup python app.py > log.txt 2>&1 &

此时:

  • nohup.out空的
  • 真实日志在 log.txt

✅ 检查:

ls -l
ps -ef | grep app.py

3️⃣ 程序输出被缓冲(非常常见)

这是“日志为空但程序在跑”的典型原因。

现象

  • 程序在运行
  • CPU / 进程都在
  • nohup.out 一直 0 字节

原因

  • Python / Java / C++ 等默认 块缓冲
  • 只有缓冲区满(通常 4KB–8KB)才写文件

解决方案

✅ Python

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

或代码里:

print("xxx", flush=True)

✅ Java

nohup java -Djava.util.logging.SimpleFormatter.buffer=false ...

✅ C / C++

  • 使用 fflush(stdout)
  • setvbuf(stdout, NULL, _IONBF, 0)

4️⃣ 程序启动失败(但 nohup 成功)

nohup 只保证“忽略挂断信号”,不保证程序一定能跑

例如:

nohup ./a.out &

如果 a.out 立刻崩溃:

  • nohup.out 可能为空
  • 或只有一行错误

✅ 查看:

cat nohup.out
jobs
ps -ef | grep a.out

5️⃣ 标准输出被程序自己关闭

某些程序(尤其是 daemon):

  • 主动 close(1)
  • freopen("/dev/null")

结果:

  • nohup.out 永远为空

✅ 解决:

  • 改程序配置
  • 或显式重定向到文件

6️⃣ 你看了错误的 nohup.out

不同目录会有不同 nohup.out

✅ 确认:

pwd
ls -l nohup.out
lsof -p <pid> | grep nohup

✅ 推荐的安全写法

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

然后:

tail -f app.log

如果你愿意,可以把:

  • 启动命令
  • 程序语言
  • nohup.out 大小
  • ps 输出

贴出来,我可以精准判断是哪一种原因。

0