温馨提示×

如何分割nohup日志

小樊
41
2026-09-15 16:13:21
栏目: 编程语言

nohup 本身不会自动分割日志,通常是把所有输出追加到 nohup.out。常见、实用的分割方式如下,按推荐程度排序。


一、最推荐:用 split 手动/定时分割(不改程序)

适合已经用:

nohup your_app >> nohup.out 2>&1 &

1. 手动切割

split -b 100M nohup.out nohup.log.

生成:

nohup.log.aa
nohup.log.ab

2. 定时切割(crontab)

# 每天凌晨切割
0 0 * * * mv nohup.out nohup.out.$(date +\%F) && touch nohup.out

⚠️ 注意:

  • 只适合追加写的日志
  • mv 后程序仍写原 fd,需要 touch 新文件并重启或支持 reopen

二、最规范:用 logrotate(生产首选 ✅)

示例配置 /etc/logrotate.d/myapp

/opt/app/nohup.out {
    daily
    rotate 7
    size 100M
    missingok
    notifempty
    copytruncate
}

关键参数说明:

  • copytruncate:复制后清空原文件(不重启进程
  • size:超过大小就切
  • rotate 7:保留 7 份

测试:

logrotate -d /etc/logrotate.d/myapp   # 调试
logrotate -f /etc/logrotate.d/myapp   # 强制执行

最安全、最常用


三、从源头避免:不用 nohup.out,直接交给日志工具

1. 用 rotatelogs(Apache 工具)

nohup your_app | rotatelogs -l /var/log/app/%Y%m%d.log 86400 &

2. 用 multilog(daemontools)

nohup your_app | multilog s1000000 n10 /var/log/app &

四、程序自身支持日志轮转(最好)

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

这样 完全不需要 nohup.out


五、不推荐但可应急

> nohup.out

只能清空,不能保留历史。


总结建议

场景 方案
生产环境 ✅ logrotate
临时脚本 split
新项目 程序内日志轮转
已运行不能重启 copytruncate

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

  • 什么语言/程序
  • 是否在容器里
  • 是否可重启

我可以给你精确配置

0