温馨提示×

centos nohup日志为啥为空

小樊
53
2026-09-06 07:59:42
栏目: 智能运维

在 CentOS 上使用 nohup 时,日志为空是比较常见的问题,通常不是 nohup 本身坏了,而是程序没往你以为的地方写、或者程序根本没跑、或者输出被缓冲了。下面按最常见原因逐一说明:


一、最常见原因汇总

1️⃣ 程序根本没启动 / 启动就退出了

nohup your_command > nohup.out 2>&1 &

如果:

  • 命令路径写错
  • 依赖缺失
  • 参数错误

程序会立刻退出,nohup.out 可能是 0 字节。

✅ 排查:

echo $?
jobs
ps -ef | grep your_command

2️⃣ 输出被 shell 重定向覆盖了(你看了错误的文件)

很多人以为日志在 nohup.out,但其实:

  • 你在别的目录执行
  • 或者手动指定了其他文件

✅ 确认:

ls -l nohup.out
pwd

如果用了:

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

那就看 /var/log/app.log


3️⃣ 程序输出被“缓冲”了(非常常见)

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

  • 标准输出是行缓冲
  • 后台运行时会变成全缓冲
  • 不 flush 就不会写文件

✅ 表现:

  • 程序在跑
  • 日志文件一直是空的
  • 停掉程序后突然有内容

✅ 解决办法:

Python

python -u app.py

print(x, flush=True)

Java

java -Djava.util.logging.manager=...

或确保使用 System.out.flush()

通用(不推荐但有效)

stdbuf -oL nohup your_command > nohup.out 2>&1 &

4️⃣ 程序只写 stderr,而你只看了 stdout

如果你这样启动:

nohup app > nohup.out &

但程序只输出到 stderr,那 nohup.out 就是空的。

✅ 正确写法:

nohup app > nohup.out 2>&1 &

5️⃣ nohup 被系统 kill 了(OOM / 退出信号)

CentOS 上:

  • OOM Killer
  • 注销会话(没完全脱离)

✅ 更稳妥方式(推荐):

setsid your_command > nohup.out 2>&1 &

nohup your_command > nohup.out 2>&1 &
disown

6️⃣ 程序自己管理日志(根本不写 stdout)

很多服务(如 nginx、mysql、自定义程序):

  • 日志写到自己的文件
  • 不输出到终端

✅ 查看程序配置:

grep log app.conf

二、推荐的标准写法(CentOS 通用)

nohup your_command > run.log 2>&1 &
disown

或者更稳:

setsid your_command > run.log 2>&1 &

三、快速自检清单 ✅

  • [ ] ps 看进程是否在
  • [ ] 看的是正确的日志文件
  • [ ] 是否 2>&1
  • [ ] 是否输出被缓冲
  • [ ] 程序是否自己写日志
  • [ ] 是否立刻退出

如果你愿意,可以把:

  • 你用的 具体命令
  • 什么程序
  • nohup.out 大小

发出来,我可以直接帮你精准定位原因。

0