nohup 本身不会自动做日志滚动(log rotation),日志会一直往 nohup.out 或你重定向的文件里写。要实现滚动,常见做法有以下几种(从简单到规范):
nohup.outnohup java -jar app.jar > app.log 2>&1 &
: > app.log
# 或
truncate -s 0 app.log
✅ 适合临时方案
❌ 不会自动滚动
logrotate(✅ 推荐,生产环境)这是 最标准、最安全 的方式。
sudo vim /etc/logrotate.d/myapp
/path/to/app.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
| 参数 | 作用 |
|---|---|
| daily | 每天滚动 |
| rotate 7 | 保留 7 份 |
| compress | 压缩旧日志 |
| missingok | 日志不存在不报错 |
| notifempty | 空文件不滚动 |
| copytruncate | 复制后清空(不重启进程) |
✅ 不需要改程序
✅ 适合 nohup / Java / Python 等
cronolog(按时间自动切)yum install cronolog
# 或
apt install cronolog
nohup java -jar app.jar | cronolog /path/app.%Y%m%d.log >> /dev/null 2>&1 &
✅ 自动按日期生成日志
❌ 额外依赖
mv app.log app.log.$(date +%F)
kill -HUP $(cat app.pid)
⚠️ 很多程序不支持 HUP 重新打开日志文件
示例(Logback):
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
然后:
nohup java -jar app.jar > /dev/null 2>&1 &
✅ 最干净、最专业
| 场景 | 推荐方案 |
|---|---|
| 临时测试 | 重定向 + 手动清空 |
| 生产环境 | ✅ logrotate |
| 想按时间切 | cronolog |
| 长期维护 | ✅ 日志框架 |
如果你愿意,可以告诉我:
我可以帮你直接写一份 可用的 logrotate 配置。