温馨提示×

nohup日志为何中断

小樊
39
2026-09-15 16:27:24
栏目: 编程语言

nohup 日志中断(即 nohup.out 或重定向日志不再更新、变空、截断、停止输出)是常见的运维问题,通常不是 nohup 本身“断了”,而是进程、输出缓冲、文件系统或运行环境发生了变化。下面按最常见原因 → 排查方法 → 解决办法来说明。


一、最常见原因

1️⃣ 程序本身退出 / 崩溃

这是最常见的情况。

表现:

  • 日志突然停止
  • ps 看不到进程
  • nohup.out 不再增长

排查:

ps -ef | grep 你的程序
echo $?

或看退出码:

jobs -l

解决:

  • 检查程序异常(OOM、空指针、段错误)
  • 用 dmesg | grep -i kill 看是否被 OOM kill

2️⃣ 输出被缓冲(stdout 缓冲)

非常容易踩坑

  • nohup 默认重定向到 nohup.out
  • 若程序使用 块缓冲(如 Python / C),日志不会实时写入

表现:

  • 程序在跑
  • 日志很久不更新
  • 停止程序后日志突然“补上”

常见于:

  • Python
  • Java(非 console appender)
  • C/C++ 自己写日志

解决:

  • Python:
python -u main.py
  • 或加环境变量:
PYTHONUNBUFFERED=1
  • Java:
    • 使用 ConsoleAppender
    • 或 Log4j 设置 immediateFlush=true

3️⃣ 日志被截断 / 覆盖

你可能:

nohup xxx > log.txt 2>&1

但后来:

> log.txt

或脚本里又 > log.txt

结果:

  • 文件大小变 0
  • 看起来“日志中断”

解决:

  • 用 >> 追加
  • 不要随意 > 正在写的日志

4️⃣ nohup.out 被删除 / 移动

Linux 中:

  • 文件删了,进程仍持有 fd
  • 日志“看起来没了”,实际还在写

表现:

ls nohup.out   # 不存在
但 du -sh /proc/PID/fd

排查:

ls -l /proc/PID/fd

解决:

  • 不要删除正在写的日志
  • 用 logrotate 正确轮转

5️⃣ 终端 / SSH 断开影响

虽然 nohup 本应避免,但:

  • 某些程序仍依赖 tty
  • 或你没用 &

错误示例:

nohup python main.py
# 没加 &

正确:

nohup python main.py > out.log 2>&1 &

6️⃣ 磁盘满 / inode 满

表现:

  • 日志停止
  • df -h 正常但 df -i 满

排查:

df -h
df -i

7️⃣ 文件系统 / 挂载变化

例如:

  • Docker 容器停止
  • NFS 断开
  • 云盘卸载

日志写入直接失败。


二、推荐的“稳定日志姿势”

✅ 标准写法:

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

✅ 更好:用 setsid

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

✅ 生产级:

  • systemd
  • supervisor
  • pm2(Node)
  • logrotate

三、快速自检清单

ps -ef | grep 程序
ls -l /proc/PID/fd
df -h
df -i
tail -f app.log

如果你愿意,可以告诉我:

  • 用什么语言(Python / Java / C++)
  • 启动命令
  • 日志是“停止更新”还是“文件消失”

我可以直接帮你定位是哪一种原因。

0 踩