在 CentOS 上,nohup 本身是不会做日志轮转的,它只是把输出重定向到文件(如 nohup.out)。日志轮转需要借助 logrotate 或应用自身机制。
下面给你几种常见、可行方案,从推荐到临时方案。
假设你用 nohup 启动程序:
nohup /opt/app/app.sh >> /var/log/app/app.log 2>&1 &
sudo vi /etc/logrotate.d/app
内容示例:
/var/log/app/app.log {
daily
missingok
notifempty
size 100M
rotate 7
compress
delaycompress
copytruncate
}
copytruncate:非常重要,适用于 nohup 程序(不能发送信号)size 100M:超过 100M 就轮转rotate 7:保留 7 个旧日志compress:压缩旧日志logrotate -d /etc/logrotate.d/app # 模拟
logrotate -f /etc/logrotate.d/app # 强制执行
很多人直接用:
nohup java -jar app.jar &
会生成 nohup.out
不要直接写 nohup.out,改为:
nohup java -jar app.jar >> /var/log/app/app.log 2>&1 &
然后按上面的 logrotate 配置即可。
如果程序支持:
logging.file + logging.logback)✅ 这是最优雅方案 ✅ 不需要 copytruncate ✅ 不会丢日志
: > nohup.out
0 0 * * * mv /var/log/app/app.log /var/log/app/app.log.$(date +%F)
⚠ 风险:nohup 进程可能继续写旧 fd
| 场景 | 建议 |
|---|---|
| 长期运行服务 | logrotate + copytruncate |
| Java / Spring | 用框架日志轮转 |
| 临时脚本 | 重定向 + logrotate |
| nohup.out 太大 | 改成指定日志文件 |
如果你愿意,可以告诉我:
我可以帮你直接写一份可用的 logrotate 配置。