nohup 本身不会自动按天切割日志,它只是把输出重定向到文件(如 nohup.out)。要实现按天切割,常见做法有以下几种:
logrotate(最推荐,生产环境)sudo vim /etc/logrotate.d/myapp
示例(假设日志是 /home/user/app/nohup.out):
/home/user/app/nohup.out {
daily
missingok
rotate 30
compress
delaycompress
copytruncate
notifempty
}
daily:每天切割rotate 30:保留 30 天copytruncate:复制后清空原文件(不中断 nohup 进程)compress:压缩旧日志logrotate -d /etc/logrotate.d/myapp # 测试
logrotate -f /etc/logrotate.d/myapp # 强制执行
✅ 优点:标准、稳定、无需改代码
❌ 缺点:需要系统权限
不要直接写 nohup.out,而是用日期命名:
nohup java -jar app.jar >> app_$(date +%Y%m%d).log 2>&1 &
但这样不会自动跨天切换,需要配合 cron。
更优雅的是用日志框架(如 logback / log4j2):
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
✅ 最推荐方式(应用层解决)
cronolog(老方案)nohup ./app | cronolog /path/logs/app_%Y%m%d.log &
安装:
yum install cronolog
# 或
apt install cronolog
✅ 自动按天
❌ 已多年不活跃维护
0 0 * * * mv nohup.out nohup_$(date -d yesterday +%Y%m%d).log
⚠️ 风险:mv 后 nohup 可能继续写旧 fd
| 场景 | 推荐方案 |
|---|---|
| 已有 nohup 进程 | logrotate + copytruncate |
| 新项目 | 日志框架按天滚动 |
| 简单脚本 | cronolog |
如果你愿意,可以告诉我:
我可以给你最合适的方案。