在 CentOS 下使用 nohup 时,日志不输出通常不是 nohup 本身的问题,而是输出方式、缓冲或重定向的问题。下面按常见原因逐一说明,并给出排查和解决方法。
一、最常见原因:标准输出被缓冲(stdout 缓冲)
现象
- 程序在终端运行时能看到输出
- 用
nohup启动后,nohup.out里没有内容或很久才出现
原因
很多程序(尤其是 Python、Java、C/C++)在:
- ✅ 终端(tty):stdout 行缓冲,遇到
\n就刷新 - ❌ 非终端(nohup):stdout 变成全缓冲,要等缓冲区满才写文件
解决方案
✅ 1. 强制刷新输出
Python 示例
nohup python -u your_script.py > nohup.out 2>&1 &
-u 表示不缓冲 stdout/stderr
或代码中:
print("xxx", flush=True)
C / C++
setvbuf(stdout, NULL, _IONBF, 0);
二、没有正确重定向输出
错误示例
nohup ./app
但程序输出到了:
- stderr
- 或日志框架(log4j / logback / logging)
正确写法
nohup ./app > nohup.out 2>&1 &
说明:
-
> nohup.out:重定向 stdout -
2>&1:stderr 也写入 nohup.out
三、程序根本没输出到 stdout / stderr
常见情况
- 使用了 日志框架
- 输出到了:
/var/log/xxx.log- 配置文件指定的路径
排查方法
lsof -p PID
看看程序实际打开了哪些文件。
四、nohup.out 不在你以为的目录
默认行为
-
nohup.out会生成在启动命令时的当前目录
常见坑
cd /tmp
nohup /opt/app/run.sh &
日志在 /tmp/nohup.out,不是 /opt/app/
建议
明确指定路径:
nohup ./app > /data/logs/app.log 2>&1 &
五、程序启动失败(根本没跑起来)
排查
ps -ef | grep app
或查看:
nohup.out
里面可能有报错信息(如 Java 缺少依赖)
六、CentOS 7 systemd 影响(少见)
如果你在 systemd 服务 或 cron 里调用 nohup:
- 环境变量不同
- stdout 被丢弃
✅ 解决:
- 不要依赖
nohup - 改用
systemd管理
七、推荐的标准用法(总结)
✅ 最稳妥写法
nohup your_command > /data/logs/app.log 2>&1 &
✅ 查看实时日志
tail -f /data/logs/app.log
八、如果你愿意,我可以进一步帮你
你可以直接贴出:
- 启动命令
- 程序语言(Python / Java / C++ / Shell)
- 是否有日志框架
我可以精确告诉你为什么没输出,以及怎么改。