温馨提示×

debian nohup日志为何丢失

小樊
38
2026-09-25 19:23:03
栏目: 智能运维

在 Debian(以及大多数 Linux 发行版)上,使用 nohup 时日志“丢失”通常不是真的被删除了,而是输出没有写到你以为的地方,或者进程根本没按预期运行。下面按常见原因逐一说明。


一、最常见原因:nohup 默认只重定向 stdout

现象

nohup ./app.sh &

你以为日志会都在 nohup.out,但“看不到日志”。

原因

  • nohup 默认只重定向 stdout(标准输出)
  • stderr(标准错误)仍然可能:
    • 打到终端(但终端已关闭)
    • 或直接丢失

解决

显式重定向 stdout + stderr:

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

或:

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

✅ 这是日志“丢失”的第一大原因


二、程序自己做了日志处理

现象

  • nohup.out 是空的
  • 或日志在别的地方

原因

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

  • 使用日志框架(log4j、logging、winston)
  • 直接写文件
  • 或禁用 stdout

排查

ls -l /proc/<pid>/fd

看程序实际往哪个 fd 写。


三、当前目录不是你以为的目录

现象

nohup python app.py &

找不到 nohup.out

原因

  • nohup.out 写在当前工作目录
  • 如果你在 systemd、cron、或 su 下运行,目录可能是 / 或 /root

解决

nohup ./app.sh > /var/log/app.log 2>&1 &

四、磁盘 / 权限问题

现象

  • 日志文件存在但 0 字节
  • 或根本创建不了

原因

  • 目录无写权限
  • 磁盘满
  • 在只读文件系统

检查

df -h
touch test.log

五、进程其实是退出了(你以为在跑)

现象

  • 启动后马上“没日志”
  • ps 看不到进程

原因

  • 程序启动失败
  • 被 shell 立即退出
  • 依赖环境变量缺失

排查

nohup ./app.sh > app.log 2>&1 &
echo $?
ps aux | grep app

六、终端关闭方式不对(不常见)

nohup 的意义是:

忽略 SIGHUP,终端关闭也不退出

但如果:

  • 用 kill -9 杀父 shell
  • 或程序自己捕获并退出

日志仍可能不完整。


七、更好的替代方案(强烈推荐)

1️⃣ setsid

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

2️⃣ disown

./app.sh > app.log 2>&1 &
disown

3️⃣ systemd(生产环境最佳)

[Service]
ExecStart=/path/app
StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app.err

快速自检清单 ✅

  • [ ] 是否重定向了 2>&1
  • [ ] 日志路径是否写对
  • [ ] 进程是否真的在跑
  • [ ] 程序是否自己写日志
  • [ ] 是否用了 nohup.out 但目录不对

如果你愿意,可以贴出:

  • 你的 nohup 命令
  • 程序语言 / 类型
  • 运行方式(SSH / cron / systemd)

我可以帮你精确分析“日志去哪了”。

0 踩