nohup 本身不会按天切割日志,它只是把输出重定向到 nohup.out。要实现按天切割 nohup 日志,常用有以下几种方案,从简单到规范依次说明。
启动命令时直接按日期生成日志文件:
nohup java -jar app.jar > logs/app_$(date +%Y-%m-%d).log 2>&1 &
✅ 适合每天重启服务的场景
nohup java -jar app.jar > nohup.out 2>&1 &
cut_nohup.sh#!/bin/bash
LOG_DIR=/path/to/logs
DATE=$(date +%Y-%m-%d)
mv $LOG_DIR/nohup.out $LOG_DIR/nohup_$DATE.log
# 让程序继续写新的 nohup.out
touch $LOG_DIR/nohup.out
chmod +x cut_nohup.sh
0 0 * * * /path/to/cut_nohup.sh
✅ 优点:简单、稳定
⚠️ 注意:
nohup.out这是最标准、最专业的做法。
/path/to/logs/nohup.out
vim /etc/logrotate.d/nohup
内容示例:
/path/to/logs/nohup.out {
daily
rotate 30
missingok
notifempty
compress
copytruncate
dateext
dateformat -%Y-%m-%d
}
| 参数 | 说明 |
|---|---|
| daily | 每天切割 |
| rotate 30 | 保留 30 天 |
| compress | 压缩旧日志 |
| copytruncate | 不重启程序直接切割 |
| dateext | 按日期命名 |
logrotate -vf /etc/logrotate.d/nohup
✅ 优点
如果可以,不要用 nohup + 日志切割,而是用 systemd。
[Service]
StandardOutput=append:/var/log/app/app.log
StandardError=append:/var/log/app/app.log
然后配合 logrotate。
| 方案 | 适合场景 | 推荐度 |
|---|---|---|
| 启动时按天 | 简单脚本 | ⭐⭐ |
| cron 手动切割 | 老项目 | ⭐⭐⭐ |
| logrotate | 生产环境 | ⭐⭐⭐⭐⭐ |
| systemd | 新服务 | ⭐⭐⭐⭐⭐ |
如果你愿意,可以告诉我:
nohup.out 还是其他文件?我可以帮你给出完全可直接用的脚本或配置。