温馨提示×

centos nohup日志为何不写

小樊
34
2026-09-21 11:14:48
栏目: 智能运维

在 CentOS 上使用 nohup 时,日志不写入文件通常有下面几种常见原因,你可以逐一排查。


一、最常见原因总结(先给结论)

  1. 输出被重定向错了
  2. 程序本身没有输出(或输出到别处)
  3. 程序崩溃 / 没真正运行
  4. 日志被缓冲(stdout 缓冲)
  5. nohup.out 没在当前目录
  6. 权限问题

二、nohup 默认日志位置

nohup command &

默认会写入:

nohup.out   # 当前目录

如果没有写权限,会尝试:

$HOME/nohup.out

三、常见错误用法(重点)

❌ 错误 1:没有重定向

nohup python app.py &

✅ 正确写法(推荐):

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

❌ 错误 2:只重定向 stdout,没重定向 stderr

nohup python app.py > app.log &

如果程序报错,错误在 stderr,不会进 app.log

✅ 正确:

2>&1

四、程序“看起来没日志”的真实原因

1️⃣ 程序没有输出

很多程序:

  • 只在 DEBUG 模式输出
  • 使用 logging 配置到文件
  • 或干脆静默运行

✅ 排查:

strace -f -e write nohup your_command

2️⃣ stdout 缓冲(非常常见)

Python / Java / C++ 常见

nohup python app.py > app.log &

Python 在非 TTY 下:

  • print块缓冲
  • 不 flush 就不写文件

✅ 解决:

python -u app.py

或:

stdbuf -oL python app.py

3️⃣ 程序已经退出

ps -ef | grep app.py

如果没有进程:

  • 日志自然不增长
  • 错误在 stderr(没重定向)

✅ 检查:

cat nohup.out

五、正确的标准写法(强烈推荐)

nohup your_command > run.log 2>&1 &

查看:

tail -f run.log

六、CentOS 特有问题

1️⃣ SELinux

getenforce

如果是 Enforcing,可能限制写文件

✅ 临时测试:

setenforce 0

2️⃣ 文件系统只读

mount | grep "on / "

七、更现代的替代方案(推荐)

systemd(CentOS 7+)

systemctl start your.service
journalctl -u your.service -f

或 tmux / screen

tmux new -s app

八、快速自检清单 ✅

  • [ ] 是否用了 > log 2>&1
  • [ ] 程序是否真的在运行
  • [ ] 是否用了 -ustdbuf
  • [ ] 是否真的有输出
  • [ ] 是否权限 / SELinux 问题

如果你愿意,可以把:

  • 你的 nohup 命令
  • 程序语言
  • CentOS 版本

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

0