温馨提示×

nohup日志如何轮转

小樊
48
2026-09-21 18:04:00
栏目: 编程语言

nohup 本身不具备日志轮转(log rotation)功能,它只是把程序输出重定向到文件(通常是 nohup.out)。要实现 nohup 日志的轮转,需要借助外部机制。下面是常见做法,从简单到专业。


一、最常用:用 logrotate(推荐)

1. 基本思路

  • nohup 程序持续写日志文件
  • logrotate 定期重命名/压缩旧日志
  • 配合 copytruncate 或 信号重载

2. 示例(nohup.out 轮转)

假设日志文件是:

/opt/app/nohup.out

创建 logrotate 配置:

sudo vim /etc/logrotate.d/myapp

内容:

/opt/app/nohup.out {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

3. 关键参数说明

  • copytruncate:不重启程序,先复制日志再清空原文件(适合 nohup)
  • daily / rotate 7:每天轮转,保留 7 份
  • compress:压缩旧日志

4. 手动测试

logrotate -d /etc/logrotate.d/myapp   # 模拟
logrotate -f /etc/logrotate.d/myapp   # 强制执行

✅ 这是生产环境最推荐方式


二、程序自身支持日志轮转(更好)

如果你能控制程序:

  • Java → Logback / Log4j2
  • Python → logging + RotatingFileHandler
  • Go → zap / logrotate

这样 不需要 nohup.out 轮转,例如:

nohup python app.py > /dev/null 2>&1 &

日志由程序自己管理。


三、用 cron + 脚本(简单但不优雅)

0 0 * * * mv /opt/app/nohup.out /opt/app/nohup.$(date +%F).log

⚠ 问题:

  • 程序仍写旧 fd
  • 需要程序支持重新打开日志(否则日志丢失)

四、避免直接用 nohup.out(最佳实践)

推荐写法

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

再配合 logrotate


五、进阶:用 systemd(最强)

如果是服务器程序,不要用 nohup,用 systemd:

[Service]
StandardOutput=append:/var/log/myapp/app.log

systemd 自动管理日志。


总结建议

场景 推荐方案
临时脚本 nohup + logrotate(copytruncate)
长期服务 systemd
可控程序 程序内日志轮转
简单需求 cron + mv(不推荐)

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

  • 用的什么语言(Java / Python / Go / Shell)
  • 是否是服务器长期运行

我可以给你定制一套日志轮转方案。

0 踩