温馨提示×

linux nohup日志怎么轮转

小樊
40
2026-09-12 10:11:35
栏目: 智能运维

在 Linux 下使用 nohup 启动程序时,日志通常是直接写入一个文件(如 nohup.out 或自定义日志文件)。nohup 本身不具备日志轮转(log rotation)功能,需要借助系统或第三方工具来实现。

下面按常见程度和使用场景给你几种方案。


一、最推荐:使用 logrotate(系统级,标准方案)

1. 原理

logrotate 是 Linux 自带工具,可以按时间或大小切割、压缩、删除旧日志。

2. 示例:轮转 nohup 日志

假设你用:

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
}

3. 关键参数说明

  • daily:每天轮转
  • rotate 7:保留 7 份
  • compress:压缩旧日志
  • copytruncate:✅ 重要,不重启进程直接截断日志(适合 nohup)

4. 手动测试

sudo logrotate -f /etc/logrotate.d/app

这是生产环境最稳妥的方式


二、简单场景:用 logrotate + 信号(不截断)

如果程序支持:

  • 收到 SIGUSR1 重新打开日志文件

可以改成:

postrotate
    kill -USR1 $(cat /var/run/app.pid)
endscript

⚠️ 但 nohup 程序一般不支持,所以更常用 copytruncate


三、应用层自己轮转(不推荐但常见)

很多程序支持日志轮转:

  • Java:logback / log4j2
  • Python:logging.handlers.RotatingFileHandler
  • Go:zap / 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.out 本身怎么处理?

如果你只是:

nohup ./app &

默认会写 nohup.out

建议改为:

nohup ./app > /var/log/app/app.log 2>&1 &

然后对 app.loglogrotate


总结推荐

场景 推荐方案
生产环境 ✅ logrotate + copytruncate
自己写程序 应用内日志轮转
临时测试 nohup 重定向 + 手动清理

如果你愿意,可以告诉我:

  • 用的什么语言(Java / Python / Go / Shell)
  • 是否在 Docker
  • 日志量大概多大

我可以直接给你一份可用配置

0