在使用 nohup 运行程序时,通常会把输出重定向到日志文件,例如:
nohup python app.py > app.log 2>&1 &
随着时间推移,app.log 会越来越大。下面介绍几种分割 nohup 日志文件的常见方法。
logrotate(推荐,最规范)logrotate 是 Linux 自带的日志管理工具,适合长期运行的服务。
创建 /etc/logrotate.d/app:
/var/www/app/app.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
daily:每天切割rotate 7:保留 7 个备份compress:压缩旧日志copytruncate:不重启进程,直接截断原日志(适合 nohup)✅
copytruncate对nohup非常重要,因为它不会关闭文件描述符
split 手动分割(适合一次性处理)如果日志已经很大:
split -b 100M app.log app.log.
会生成:
app.log.aa
app.log.ab
查看时可结合 less 或 grep。
cron + mv + kill -USR1(需程序支持)部分程序(如 Nginx)支持信号切割:
mv app.log app.log.$(date +%Y%m%d)
kill -USR1 <pid>
⚠️ nohup 启动的普通程序通常不支持 USR1,不推荐通用场景。
rotating 日志(Python 示例)from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler("app.log", maxBytes=10*1024*1024, backupCount=5)
nohup + logrotate 组合nohup python app.py >> app.log 2>&1 &
再由 logrotate 管理。
> app.log
或
truncate -s 0 app.log
⚠️ 会清空当前日志,但无法归档。
| 场景 | 推荐方式 |
|---|---|
| 长期运行 | logrotate + copytruncate |
| 临时处理 | split |
| 新项目 | 程序内置日志切割 |
如果你愿意,可以告诉我:
我可以给你一份可直接用的配置。