在 CentOS 上使用 nohup 时,日志为空通常不是 nohup 本身的问题,而是程序本身没有向终端输出,或者输出被其他地方接管了。下面按最常见原因逐一说明,并给出排查方法。
一、最常见原因
1️⃣ 程序本来就没有输出
很多程序默认不输出到 stdout,比如:
- 使用了日志框架(log4j / logback / Python logging)
- 只写文件日志
- 只在错误时输出
✅ 验证方法:
strace -e write -p <pid>
或直接在终端前台运行程序,看是否有输出。
2️⃣ 输出被重定向到了别的地方
你可能以为输出在 nohup.out,但实际上已经重定向了。
常见错误示例:
nohup ./app > /dev/null
nohup ./app > app.log
✅ 检查命令:
ps -ef | grep app
看看命令行里是否有 > 或其他重定向。
3️⃣ 使用了 systemd / supervisor / docker
如果程序是通过 systemd 启动的:
-
nohup.out不会产生 - 日志在
journalctl或 service 配置中
✅ 检查:
systemctl status your.service
journalctl -u your.service
4️⃣ 输出被缓冲(非常常见)
这是 CentOS / Linux 上最常见原因之一
- 程序输出到
stdout - 但 stdout 是块缓冲
- nohup 运行时不会立刻刷新
✅ 典型现象:
- 前台运行有输出
- nohup 运行后
nohup.out为空或很久才写入
✅ 解决方案:
✅ 强制刷新缓冲
Python
nohup python -u app.py > nohup.out 2>&1 &
C / C++
setbuf(stdout, NULL);
Java
nohup java -Djava.util.logging.config.file=logging.properties ...
5️⃣ 输出到了 stderr,而不是 stdout
nohup.out 默认只重定向 stdout
✅ 正确写法:
nohup ./app > nohup.out 2>&1 &
或分开:
nohup ./app > stdout.log 2> stderr.log &
6️⃣ 程序启动失败(但你没发现)
程序可能:
- 端口被占
- 配置文件错误
- 环境不一致
✅ 检查:
nohup.out
app.log
/var/log/messages
journalctl -xe
二、推荐的标准写法 ✅
✅ 最稳妥的 nohup 写法
nohup ./app > app.log 2>&1 &
✅ 查看实时日志
tail -f app.log
三、快速排查清单 ✅
# 1. 程序是否在运行
ps -ef | grep app
# 2. 是否有输出文件
ls -lh nohup.out app.log
# 3. 查看文件内容
cat nohup.out
cat app.log
# 4. 是否由 systemd 管理
systemctl list-units | grep app
# 5. 是否标准输出被缓冲
strace -e write -p <pid>
四、总结一句话 ✅
CentOS 下 nohup 日志为空,90% 是因为:输出被缓冲 / 输出到 stderr / 程序没输出 / 被 systemd 接管。
如果你愿意,可以把:
- 启动命令
- 程序语言(Java / Python / C++)
- 是否使用 systemd
贴出来,我可以直接帮你定位 ✅