在 CentOS 上,nohup 日志“丢失”或“没内容”,通常不是真的丢了,而是输出没写进去或写到了别的地方。下面按最常见原因 → 排查方法 → 解决方案给你系统说明。
你以为在写 nohup.out,其实被重定向了。
nohup java -jar app.jar > app.log 2>&1 &
此时:
app.log✅ 检查:
lsof -p <PID> | grep log
很多 Java / Python / Shell 程序:
结果:
nohup.out 是空的✅ 排查:
ps -ef | grep 程序名
jobs
✅ 前台先跑一次:
java -jar app.jar
rm -f nohup.out> nohup.out⚠️ nohup.out 被删除后不会自动重建 但文件句柄还在,日志会“消失”。
✅ 确认:
ls -l /proc/<PID>/fd/1
ls -l /proc/<PID>/fd/2
看到类似:
/dev/null
说明输出已经丢了。
nohup 对 systemd 无效
[Service]
StandardOutput=journal
StandardError=journal
✅ 要看:
journalctl -u your.service -f
cron 默认 没有终端
nohup 基本没意义
✅ 正确写法:
*/5 * * * * /opt/app.sh >> /var/log/app.log 2>&1
程序输出被缓冲,还没刷到磁盘。
✅ Python 解决:
nohup python -u app.py > app.log 2>&1 &
✅ Java:
System.out| 情况 | 日志位置 |
|---|---|
| 没重定向 | 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 ✅你可以直接贴:
我可以一步一步帮你找出“日志到底去哪了”。