„Filedescriptor außerhalb des gültigen Bereichs in select()“ bei Verwendung des Python-Unterprozesses mit rsyncPython

Python-Programme
Guest
 „Filedescriptor außerhalb des gültigen Bereichs in select()“ bei Verwendung des Python-Unterprozesses mit rsync

Post by Guest »

Der folgende Code wird verwendet, um hochgeladene Bilder an einen anderen Ort zu synchronisieren. Es funktioniert, aber nach einer gewissen Zeit (ca. 10 Tage) ist der Dienst unbrauchbar und zeigt den Fehler „Filedescriptor außerhalb des gültigen Bereichs in select()“ an. Ein Neustart des Dienstes löst das Problem.

Code: Select all

# 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)
Protokollinformationen:

Code: Select all

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()
Gibt es nicht geschlossene Dateideskriptoren, die den Fehler verursachen? Es scheint, dass der Unterprozess den Dateideskriptor nicht schließt. Wenn er also 1024 Mal ausgeführt wird, liegt der Dateideskriptor außerhalb des zulässigen Bereichs. (Wir verwenden Python 2.6, der Unterprozess ist gezwungen, select.select() zu verwenden, das eine Grenze von 1024 Dateideskriptoren hat, selbst wenn Epoll verfügbar ist)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post