在 CentOS 上,nohup 日志“丢失”或“没内容”,通常不是真的丢了,而是输出没写进去或写到了别的地方。下面按最常见原因 → 排查方法 → 解决方案给你系统说明。
一、最常见原因(90% 都在这里)
1️⃣ 输出被重定向到了别的地方
你以为在写 nohup.out,其实被重定向了。
nohup java -jar app.jar > app.log 2>&1 &
此时:
- 不会写 nohup.out
- 日志在
app.log
✅ 检查:
lsof -p <PID> | grep log
2️⃣ 程序刚启动就退出(日志还没来得及写)
很多 Java / Python / Shell 程序:
- 配置错误
- 端口被占用
- 环境变量缺失
结果:
-
nohup.out是空的 - 程序已经退出了
✅ 排查:
ps -ef | grep 程序名
jobs
✅ 前台先跑一次:
java -jar app.jar
3️⃣ nohup.out 被覆盖 / 删除
- 你
rm -f nohup.out - 或脚本里
> nohup.out
⚠️ nohup.out 被删除后不会自动重建 但文件句柄还在,日志会“消失”。
✅ 确认:
ls -l /proc/<PID>/fd/1
ls -l /proc/<PID>/fd/2
看到类似:
/dev/null
说明输出已经丢了。
4️⃣ 使用了 systemd / crontab / sudo
systemd
nohup 对 systemd 无效
[Service]
StandardOutput=journal
StandardError=journal
✅ 要看:
journalctl -u your.service -f
crontab
cron 默认 没有终端
nohup 基本没意义
✅ 正确写法:
*/5 * * * * /opt/app.sh >> /var/log/app.log 2>&1
5️⃣ 输出被缓冲(尤其是 Python / Java)
程序输出被缓冲,还没刷到磁盘。
✅ Python 解决:
nohup python -u app.py > app.log 2>&1 &
✅ Java:
- 使用日志框架(logback / log4j)
- 不要只靠
System.out
二、nohup 日志的默认规则(很重要)
| 情况 | 日志位置 |
|---|---|
| 没重定向 | nohup.out |
有 >
|
你指定的文件 |
| 标准错误没处理 | 仍可能丢 |
| systemd | 不会写 nohup.out |
三、推荐的“不会丢日志”写法 ✅
✅ 最稳妥
nohup ./app.sh > /var/log/app.log 2>&1 &
✅ 带日期
nohup ./app.sh >> /var/log/app_$(date +%F).log 2>&1 &
✅ 后台 + 可追踪
nohup ./app.sh > /var/log/app.log 2>&1 &
echo $! > /var/run/app.pid
四、快速自检清单 ✅
ps -ef | grep app
ls -l /proc/<PID>/fd/1
ls -l /proc/<PID>/fd/2
是否指向:
-
/dev/null❌ -
/var/log/app.log✅
五、如果你愿意,我可以帮你精准定位
你可以直接贴:
- 启动命令
- 程序类型(Java / Python / Shell)
- CentOS 版本
- 是否 systemd / crontab
我可以一步一步帮你找出“日志到底去哪了”。