温馨提示×

为何nohup日志丢失

小樊
56
2026-09-24 19:36:30
栏目: 编程语言

nohup 日志“丢失”通常不是 nohup 本身把日志删了,而是日志被重定向方式、缓冲、或进程退出方式影响了。常见原因有下面几类:


1. 没重定向,或重定向错了

很多人以为 nohup cmd & 就一定会写 nohup.out,其实不一定。

常见错误用法

nohup python app.py &

✅ 默认会写 nohup.out(在当前目录)

但如果:

nohup python app.py > /dev/null 2>&1 &

那日志直接被丢弃,当然“看不到”

或者:

nohup python app.py > log.txt

但 2>&1 没加,错误日志不在 log.txt 里

✅ 推荐写法:

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

2. 当前目录不可写 / 被切换

nohup.out 是写在启动命令时的当前目录:

cd /tmp
nohup xxx &

如果:

  • 当前目录被删
  • 或你后来 cd 到别的地方
  • 或程序在容器 / 服务里启动

你就找不到 nohup.out

✅ 建议显式指定绝对路径:

nohup xxx > /var/log/xxx.log 2>&1 &

3. 标准输出被缓冲(最常见“看起来丢了”)

很多程序(尤其是 Python、Java):

  • 写到 stdout
  • 但 块缓冲
  • 不 flush
  • 你 tail -f 时啥也看不到

Python 示例

print("start")
time.sleep(3600)

日志可能不会立刻出现

✅ 解决:

python -u app.py

或:

print("start", flush=True)

4. 进程被 kill / 终端关闭导致没 flush

如果你:

  • Ctrl + C
  • 关终端
  • kill -9

缓冲中的日志不会写入文件

✅ 正常退出:

kill PID

5. 日志被日志轮转 / 覆盖

如果:

  • 用 > log 而不是 >> log
  • 或 cron / 脚本重复启动
  • 或 logrotate 切走

你可能看到“旧日志没了”

✅ 用追加:

>> app.log 2>&1

6. nohup 并不是日志工具

nohup 只做一件事:

忽略 SIGHUP,让进程不被终端关闭杀掉

它不保证日志完整、不轮转、不持久化

生产环境更推荐:

  • systemd
  • supervisor
  • screen / tmux

快速自查清单

ps -ef | grep 你的进程
ls -l 你写的日志路径
tail -f 日志路径

如果你愿意,可以贴一下:

  • 你用的命令
  • 什么程序
  • 日志“丢失”的具体表现

我可以直接帮你定位是哪一类问题。

0 踩