在使用 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 安全rotating 日志(Python 示例)from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler("app.log", maxBytes=10*1024*1024, backupCount=5)
supervisord / systemd它们内置日志轮转,比 nohup 更可靠。
mv 吗?❌ 不建议
mv 后原进程仍写旧 inode,日志不会到新文件。
✅ 正确做法:copytruncate 或重启程序
| 场景 | 推荐方式 |
|---|---|
| 长期运行 | logrotate |
| 临时处理 | split |
| 简单脚本 | cron + cp + > |
| 新项目 | systemd / supervisor |
如果你愿意,可以告诉我:
我可以给你更精确的配置。