温馨提示×

linux nohup日志为何停止写

小樊
39
2026-10-21 01:16:22
栏目: 智能运维

在 Linux 下使用 nohup 运行程序时,日志突然停止写入是比较常见的问题,通常不是 nohup 本身“坏了”,而是以下某一种原因导致的。


一、最常见原因总结(先给结论)

  1. 程序已经退出 / 崩溃
  2. 日志被重定向到了别的地方
  3. 标准输出被缓冲(buffer),没刷新
  4. 磁盘满了 / inode 用尽
  5. 日志被 rotated(日志切割)但程序没重新打开文件
  6. 你 tail 的是错误文件(stdout / stderr 混淆)
  7. nohup.out 被删除,但程序仍持有旧 fd

二、逐条详细解释

1️⃣ 程序其实已经退出了

ps -ef | grep your_program

如果进程不在了,日志当然不写。

常见原因:

  • 抛异常退出
  • 收到 SIGTERM
  • OOM 被杀

✅ 解决:

  • 用 nohup cmd > log 2>&1 &
  • 或用 supervisor / systemd

2️⃣ 日志被重定向到别处

你可能以为在写 nohup.out,其实:

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

日志在 app.log

✅ 检查:

ls -l /proc/<pid>/fd

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

例如 Python:

nohup python test.py > log &

Python 发现不是终端 → 全缓冲 可能几分钟甚至几小时都不写盘。

✅ 解决:

python -u test.py

或

stdbuf -oL python test.py

4️⃣ 磁盘满了或 inode 用尽

df -h
df -i

如果 100%,日志无法写入。


5️⃣ 日志被 rotate,但程序没重开文件

例如:

  • logrotate 把 nohup.out 改名
  • 程序仍写旧 fd

✅ 检查:

ls -l /proc/<pid>/fd

✅ 解决:

  • 用 logrotate + copytruncate
  • 或发 SIGUSR1 让程序重开日志

6️⃣ stdout / stderr 混淆

你可能只看:

tail -f nohup.out

但错误在 stderr。

✅ 正确写法:

nohup cmd > out.log 2>&1 &

7️⃣ nohup.out 被删除

rm nohup.out

但进程还活着 → 日志“消失”

✅ 查看:

ls -l /proc/<pid>/fd

✅ 恢复:

cat /proc/<pid>/fd/1 > nohup.out

三、推荐的安全写法 ✅

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

或更好的方式:

setsid ./your_app >> app.log 2>&1 < /dev/null &

长期运行强烈建议:

  • systemd
  • supervisord

四、快速自查清单 ✅

  • [ ] 进程还在吗?
  • [ ] 日志文件对吗?
  • [ ] 是否 Python/Java 缓冲?
  • [ ] 磁盘满了吗?
  • [ ] 是否删过日志?
  • [ ] 是否 stdout/stderr 分开?

如果你愿意,可以把:

  • 启动命令
  • 语言(Python / Java / C++)
  • 日志停止时的现象

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

0 踩