温馨提示×

linux nohup日志为何丢失

小樊
46
2026-09-03 10:38:57
栏目: 智能运维

在 Linux 中使用 nohup 时,日志“丢失”通常不是真的被删除了,而是被重定向、缓冲、覆盖或写到了你没注意的地方。下面按常见原因逐一说明,并给出解决办法。


一、最常见原因:nohup 默认只把 stdout 写到 nohup.out

nohup python app.py &

等价于:

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

但很多人会误以为:

  • 日志一定在当前目录
  • stderr 也会自动保存(其实是)

⚠️ 问题点

  • 如果程序切换了工作目录(如 os.chdir()),nohup.out 会在新目录
  • 如果当前目录不可写,nohup 会把日志写到 ~/$HOME/nohup.out

✅ 解决:

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

二、日志被“覆盖”而不是追加

如果你多次启动:

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

第二次会 清空 app.log

✅ 使用追加:

>> app.log 2>&1

三、程序使用了日志库,绕过了 stdout

很多程序(Python / Java / Node):

  • logging
  • 写文件
  • 或输出到 syslog

结果:

  • nohup.out 是空的
  • 你以为日志“丢了”

✅ 检查:

lsof -p <pid> | grep log

四、stdout/stderr 被缓冲(最容易“看似丢失”)

Python 典型问题

print("hello")

nohup 下:

  • 不是终端 → 全缓冲
  • 程序不退出 → 日志不刷盘

✅ 解决:

python -u app.py

print("x", flush=True)

五、进程被 kill / 机器重启

  • nohup 不保证持久化
  • 进程被杀 → 缓冲未刷新 → 日志丢失

✅ 更可靠方案:

  • systemd
  • supervisord

六、你找错了日志位置

常见隐藏位置:

  • ./nohup.out
  • ~/nohup.out
  • /dev/null(如果你写错了)

检查:

ls -l nohup.out ~/nohup.out

七、重定向写到了 /dev/null

例如:

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

那当然“没有日志”。


推荐的标准写法 ✅

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

或更专业:

systemd-run --unit=app.service python app.py

如果你愿意,可以贴出:

  • 启动命令
  • 程序语言
  • 是否用日志库

我可以直接帮你定位“日志去哪了”。

0