安亿程序开发

centos nohup日志为何丢失

2 次浏览
# 智能运维 # centos

在 CentOS 上,nohup 日志“丢失”或“没内容”,通常不是真的丢了,而是输出没写进去或写到了别的地方。下面按最常见原因 → 排查方法 → 解决方案给你系统说明。 一、最常见原因(90% 都在这里) 1️⃣ 输出被重定向到了别的地方 你以为在写 nohup.out,其实被重定向了。 nohup java -jar app.jar > app.log 2>&1 &am

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

五、如果你愿意,我可以帮你精准定位

你可以直接贴:

  1. 启动命令
  2. 程序类型(Java / Python / Shell)
  3. CentOS 版本
  4. 是否 systemd / crontab

我可以一步一步帮你找出“日志到底去哪了”。