python 创建 gzip 文件时抛出异常,但是压缩成功

查看:104
本文介绍了python 创建 gzip 文件时抛出异常,但是压缩成功的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我明白了,我之前写了个shell版本的执行同样任务的程序,放在 root 的crontab 中,运行时间也是相同的,后来觉得有些问题就用python重写了,可能是我忘了注释原先的cron任务。虽然即使如此还是有些疑点,不过就不浪费别人的时间了

我写了个脚本用来在每日凌晨压缩、清理php程序产生的日志,php-fpm 使用 www 用户身份运行,生成日志的属主和属主均为www,脚本也是放在 www 用户的 crontab 中。

但是发现总是在压缩一个文件是抛出异常,说有"PermissionError: [Errno 13] Permission denied",导致余下的日志没有得到处理,奇怪的是这个文件的压缩是正常的,原始文件也被删除了(删除原始文件的代码是在成功创建压缩文件之后执行的)

相关代码如下:

def gzip_compress(filename, keep_original=False):

    with open(filename, 'rb') as f_in:
        with gzip.open(''.join([filename, '.gz']), 'wb') as f_out:
            f_out.writelines(f_in)

    if not keep_original:
        try:
            os.remove(filename)
        except PermissionError as e:
            print(e)

日志中记录的信息是

compressing /data/www/oms/logs/api/API_2016-04-07_GOODS_MODEL_API.log
Traceback (most recent call last):
  File "/usr/local/scripts/app_log_rotate.py", line 75, in <module>
    log.process()
  File "/usr/local/scripts/app_log_rotate.py", line 29, in process
    self.compress()
  File "/usr/local/scripts/app_log_rotate.py", line 41, in compress
    gzip_compress(self.filename)
  File "/usr/local/scripts/app_log_rotate.py", line 47, in gzip_compress
    with gzip.open(''.join([filename, '.gz']), 'wb') as f_out:
  File "/usr/local/services/Python-3.3.6/lib/python3.3/gzip.py", line 52, in open
    binary_file = GzipFile(filename, gz_mode, compresslevel)
  File "/usr/local/services/Python-3.3.6/lib/python3.3/gzip.py", line 184, in __init__
    fileobj = self.myfileobj = builtins.open(filename, mode or 'rb')
PermissionError: [Errno 13] Permission denied: '/data/www/oms/logs/api/API_2016-04-07_GOODS_MODEL_API.log.gz'

这个脚本总是在压缩 API_YYYY-mm-dd_GOODS_MODEL_API.log 的时候抛出异常,这个文件大概有8G,压缩之后有1G。每日执行后, API_YYYY-mm-dd_GOODS_MODEL_API.log.gz 这个文件是存在的,我检查过,可以正常解压,文件内容也正常,原始文件 API_YYYY-mm-dd_GOODS_MODEL_API.log 被成功删除,好像在执行gzip_compress函数抛出异常之后这个函数的后续代码也得到正常执行,尽管我没有做异常处理。但是脚本肯定是不正常退出的,因为还有很多需要压缩的文件没有压缩(应该是按照文件名排序进行处理的,日期在文件名的中间部分,所以很多前几天的日志也没有被处理)。

另外,我在白天重新手动以该cron任务所属用户身份执行该脚本,是没有报错的,显见只会在处理API_YYYY-mm-dd_GOODS_MODEL_API.log 的时候抛出异常。我检查过该文件的权限,也是没有问题的。

怀疑是由于文件比较大造成的,可是如何抛出异常之后后面的删除原始文件的代码能够被执行?

Python 版本: Python-3.3.6
OS : CentOS 6.7 x64

解决方案

你这个脚本是crontab调用的吗?
如果你说手动执行没问题但是每天定时任务有问题的话,感觉像是crontab分配任务权限时,对于指定的目录没有操作权限所致

这篇关于python 创建 gzip 文件时抛出异常,但是压缩成功的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆