温馨提示×

debian nohup日志为何不写

小樊
37
2026-10-28 09:35:54
栏目: 智能运维

在 Debian(以及大多数 Linux 发行版)里,nohup 本身并不会“吞掉”日志,日志不写通常是因为重定向方式、程序缓冲、shell 退出方式或路径问题导致的。下面按最常见原因逐一说明。


一、最常见原因:没有正确重定向标准输出/错误

nohup 默认会:

  • 忽略 SIGHUP
  • 把 stdout/stderr 重定向到 nohup.out(仅当未手动重定向时)

❌ 错误示例(日志可能不写)

nohup python app.py &

如果 app.py:

  • 只写 sys.stderr
  • 或使用了日志库但没 flush
  • 或当前目录不可写

就可能出现“没日志”。

✅ 正确写法(推荐)

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

或分开:

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

二、Python / Java 等“块缓冲”导致日志不刷新

现象

  • 程序在跑
  • ps 能看到进程
  • 但日志文件一直是 0 字节

原因

  • 非 TTY 下,stdout 是块缓冲
  • 只有缓冲区满(通常 4KB/8KB)才写盘

解决方案

Python

python -u app.py

或

PYTHONUNBUFFERED=1 python app.py

通用

在代码里定期 flush()


三、nohup.out 写到了“你以为不是的地方”

常见误区

cd /tmp
nohup ./app &

nohup.out 会写在 当前目录

你可能在别的地方找日志。

检查方式

ls -l nohup.out
pwd

四、程序启动失败(但 nohup 仍在)

有时:

  • 程序立刻退出
  • nohup 仍生成空日志

排查

cat nohup.out

或

tail -f app.log

五、systemd / 会话问题(SSH 断开)

即使 nohup 也存在例外:

  • 某些 shell(如 zsh)行为不同
  • 某些 PAM 配置会杀进程

更稳妥方案(Debian 推荐)

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

或

disown

六、磁盘 / 权限问题

df -h
touch nohup.out

七、推荐生产做法(Debian)

不要依赖 nohup,用:

  • systemd service
  • screen / tmux

systemd 示例

[Service]
ExecStart=/usr/bin/python /opt/app.py
StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app.err

快速自检清单 ✅

  • [ ] 是否用了 > log 2>&1
  • [ ] 程序是否缓冲输出
  • [ ] nohup.out 是否在当前目录
  • [ ] 程序是否真的在运行
  • [ ] 磁盘 / 权限是否正常

如果你愿意,可以把:

  • 启动命令
  • 程序语言
  • nohup.out 或日志内容

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

0 踩