«дескриптор файла вне диапазона в select ()» при использовании подпроцесса python с rsync

приведенный ниже код используется для синхронизации загруженного изображения с другим место. он работает, но через некоторое время (около 10 дней) сервис становится непригодным для использования, показывая ошибку: «filedescriptor out of range in select ()», но перезапуск службы решает проблему.

# sync.py

def sync_file(source_pic, hashval, retry_num=3):

    pic_path = os.path.join(gen_dir(hashval), os.path.split(source_pic)[1])
    filename = tempfile.mkstemp()[1]
    with open(filename, 'w') as f:
        f.write(pic_path)

    for sync_path in options.sync_paths:
        try_num = 0
        rsync_cmd = ['rsync','-au', '--files-from='+filename, options.pic_path, sync_path]

        while try_num < retry_num:
            proc = subprocess.Popen(rsync_cmd,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            stdout_value, stderr_value = proc.communicate()

            if len(stderr_value) != 0:
                logger.error('sync failed: %s' % stderr_value)
                try_num = try_num + 1
                #raise UploadException('sync failed')
            else:
                break

    os.remove(filename)

информация журнала:

File "/path/to/sync.py", line 25, in sync_file
    stdout_value, stderr_value = proc.communicate()
File "/usr/lib/python2.6/subprocess.py", line 691, in communicate
    return self._communicate(input)
File "/usr/lib/python2.6/subprocess.py", line 1211, in _communicate
    rlist, wlist, xlist = select.select(read_set, write_set, [])
    ValueError: filedescriptor out of range in select()

есть ли незакрытые файловые дескрипторы, вызывающие ошибку? кажется, что подпроцесс не закрывает файловый дескриптор, поэтому, когда он запускается 1024 раза, файловый дескриптор выходит за пределы допустимого диапазона. (мы используем python 2.6, подпроцесс вынужден использовать select.select (), который имеет ограничение в 1024 файловых дескриптора, даже если доступен epoll)

5
задан limboy 8 October 2011 в 08:37
поделиться