在 Linux 下使用 nohup 启动程序时,日志通常是直接写入一个文件(如 nohup.out 或自定义日志文件)。nohup 本身不具备日志轮转(log rotation)功能,需要借助系统或第三方工具来实现。
下面按常见程度和使用场景给你几种方案。
logrotate(系统级,标准方案)logrotate 是 Linux 自带工具,可以按时间或大小切割、压缩、删除旧日志。
假设你用:
nohup java -jar app.jar > /var/log/app/app.log 2>&1 &
创建配置文件:
sudo vim /etc/logrotate.d/app
内容示例:
/var/log/app/app.log {
daily
rotate 7
missingok
notifempty
compress
copytruncate
}
daily:每天轮转rotate 7:保留 7 份compress:压缩旧日志copytruncate:✅ 重要,不重启进程直接截断日志(适合 nohup)sudo logrotate -f /etc/logrotate.d/app
✅ 这是生产环境最稳妥的方式
logrotate + 信号(不截断)如果程序支持:
SIGUSR1 重新打开日志文件可以改成:
postrotate
kill -USR1 $(cat /var/run/app.pid)
endscript
⚠️ 但 nohup 程序一般不支持,所以更常用 copytruncate
很多程序支持日志轮转:
logback / log4j2logging.handlers.RotatingFileHandlerzap / logrotate示例(Python):
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler(
"app.log", maxBytes=10*1024*1024, backupCount=5
)
✅ 不需要 nohup 管日志
cron + 脚本(不推荐)0 0 * * * mv /var/log/app/app.log /var/log/app/app.log.$(date +%F)
缺点:
❌ 不建议生产使用
如果你只是:
nohup ./app &
默认会写 nohup.out
建议改为:
nohup ./app > /var/log/app/app.log 2>&1 &
然后对 app.log 做 logrotate
| 场景 | 推荐方案 |
|---|---|
| 生产环境 | ✅ logrotate + copytruncate |
| 自己写程序 | 应用内日志轮转 |
| 临时测试 | nohup 重定向 + 手动清理 |
如果你愿意,可以告诉我:
我可以直接给你一份可用配置。