温馨提示×

如何分割nohup日志文件

小樊
46
2026-09-06 14:34:55
栏目: 编程语言

在使用 nohup 运行程序时,日志通常会写入到一个文件中,例如:

nohup python app.py > app.log 2>&1 &

随着时间推移,app.log 会越来越大。下面介绍几种分割 nohup 日志文件的常见方法。


一、使用 logrotate(推荐,系统级方案)

logrotate 是 Linux 自带的日志管理工具,适合长期运行的服务。

示例配置

创建 /etc/logrotate.d/app

/path/to/app.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

关键点说明

  • copytruncate:复制原日志后清空原文件(不中断 nohup 进程
  • daily / rotate 7:每天分割,保留 7 份
  • compress:压缩旧日志

✅ 不需要重启程序,适合 nohup 场景


二、使用 split 手动分割(一次性)

如果你只是想把一个大日志拆开:

split -b 100M app.log app.log.part_

或按行数:

split -l 100000 app.log app.log.part_

⚠️ 这只是“拆分”,不会自动清理原文件。


三、使用 cron + cp / > 定期轮转(轻量方案)

示例脚本

#!/bin/bash
cp app.log app.log.$(date +%Y%m%d)
> app.log

加入 crontab:

0 0 * * * /path/to/rotate.sh

⚠️ > app.log 会清空文件,但:

  • 若程序正在写,可能丢一两行
  • 不如 copytruncate 安全

四、从一开始就用日志轮转工具(更好实践)

1. 使用 rotating 日志(Python 示例)

from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler("app.log", maxBytes=10*1024*1024, backupCount=5)

2. 使用 supervisord / systemd

它们内置日志轮转,比 nohup 更可靠。


五、常见问题

Q:nohup 日志能直接 mv 吗?

❌ 不建议
mv 后原进程仍写旧 inode,日志不会到新文件。

✅ 正确做法:copytruncate 或重启程序


总结建议

场景 推荐方式
长期运行 logrotate
临时处理 split
简单脚本 cron + cp + >
新项目 systemd / supervisor

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

  • 使用的语言(Python / Java / Shell)
  • 操作系统(CentOS / Ubuntu)
  • 是否允许重启程序

我可以给你更精确的配置。

0