温馨提示×

linux nohup日志为何中断

小樊
51
2026-09-30 15:31:40
栏目: 智能运维

在 Linux 下使用 nohup 运行程序时,日志(通常是 nohup.out)突然中断或不再更新,常见原因有以下几种,按出现频率从高到低说明:


1. 程序本身被阻塞 / 死锁

这是最常见原因。

  • 程序在等待:
    • 网络请求
    • 数据库响应
    • 标准输入(stdin)
  • 日志不再输出,但进程还在(用 ps 能看到)

✅ 排查:

ps aux | grep 程序名
strace -p PID

如果卡在 read()、futex() 等,就是阻塞了。


2. 输出被缓冲(Buffered I/O)

很多语言(如 Python、C++)在非终端输出时会缓冲。

  • 终端运行时:行缓冲,立刻看到日志
  • nohup 重定向到文件:全缓冲,几 MB 才刷一次

✅ 表现:

  • 日志“很久不更新”
  • 程序其实在跑
  • 停掉程序后日志突然多出来

✅ 解决:

  • Python:
python -u app.py

或

print(x, flush=True)
  • C/C++:
setvbuf(stdout, NULL, _IONBF, 0);

3. 磁盘 / 文件系统问题

  • 磁盘写满
  • nohup.out 所在目录被卸载
  • 使用了网络文件系统(NFS)断连

✅ 检查:

df -h
dmesg | tail

4. 日志被轮转或覆盖

  • 日志被 logrotate 移动
  • 你又重启了程序,覆盖了原文件

✅ 现象:

  • 原 nohup.out 还在,但不再增长
  • lsof | grep nohup.out 显示文件已删除

✅ 解决:

  • 用 >> 追加
  • 或指定日志文件:
nohup app >> app.log 2>&1 &

5. 标准输出 / 错误被关闭

某些框架或脚本:

  • 关闭了 stdout/stderr
  • 或 fork 后未继承

✅ 检查:

ls -l /proc/PID/fd

6. 系统 OOM / 被杀

  • 内存不足,进程被 kill
  • 但你看不到日志结束原因

✅ 检查:

dmesg | grep -i oom

7. nohup 本身并不保证“永远运行”

nohup 只是:

  • 忽略 SIGHUP
  • 重定向输出

不保证:

  • 网络断开后程序逻辑正常
  • 进程不会被 OOM、bug 杀死

✅ 更稳妥方案:

setsid ./app >> app.log 2>&1 &

或用:

  • systemd
  • supervisor
  • tmux / screen

快速自检清单

ps aux | grep 程序
lsof -p PID
df -h
tail -f app.log
strace -p PID

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

  • 用的什么语言
  • 怎么启动的(完整命令)
  • 日志是“完全停了”还是“偶尔停”

我可以更精确地判断。

0 踩