在 CentOS 上,用 nohup 启动的程序通常会把输出重定向到 nohup.out,但随着时间推移这个文件会越来越大。下面给你几种常用且实用的日志分割方案,从简单到专业。
不要直接:
nohup java -jar app.jar &
而是重定向到按日期命名的文件:
nohup java -jar app.jar > app_$(date +%Y%m%d).log 2>&1 &
缺点:不会自动滚动,需要配合定时任务。
logrotate 是 CentOS 官方日志管理工具,非常适合 nohup.out。
sudo vim /etc/logrotate.d/myapp
/opt/app/nohup.out {
daily
rotate 7
missingok
notifempty
compress
copytruncate
}
daily:每天分割rotate 7:保留 7 份compress:压缩旧日志copytruncate:关键点,不重启进程就能截断日志(适合 nohup)logrotate -d /etc/logrotate.d/myapp
logrotate -f /etc/logrotate.d/myapp
✅ 这是生产环境最稳妥方案
如果你不想用 logrotate:
0 0 * * * mv /opt/app/nohup.out /opt/app/nohup_$(date +%F).log
⚠️ 问题:nohup 仍持有旧文件句柄,日志可能继续写旧文件
✅ 解决:用 copytruncate 思路或重启服务
如果你控制代码:
logback / log4j2(RollingFile)logging.handlers.TimedRotatingFileHandlerlumberjack这样 根本不需要 nohup.out
❌ 直接 rm nohup.out
→ 磁盘不释放,进程还在写
❌ 只 > /dev/null
→ 出问题时没法排查
| 场景 | 推荐方案 |
|---|---|
| 生产环境 | ✅ logrotate |
| 简单脚本 | 重定向 + cron |
| 可控程序 | 内部日志轮转 |
| 临时跑 | nohup.out 可接受 |
如果你愿意,可以告诉我:
我可以直接帮你写一份可用的配置。