2010-10-04 11 views
0

Ce script vérifie un fichier FTP et télécharge des fichiers à intervalles réguliers.Le signal traité en Python provoque l'interruption de la connexion FTP

En lui envoyant le bon signal (SIGUSR1) devrait le faire fermer gracieusement, en attendant checkAll pour terminer, si en cours d'exécution.

class ScheduledFtpCheck(FtpCheck, Scheduler): 
    def __init__(self): 
     ... 
     self.aborted, self.checking = False, False 

    def abort(self, *args, **kwargs): 
     self.aborted = True 
     if not self.checking: self.quit() 

    def checkAll(self): 
     if not self.isAborted(): 
      self.checking = True 
      self.checkAll() 
      self.checking = False 
      if self.aborted: self.quit() 

    ... 

def main(): 
    sch = ScheduledFtpCheck() 
    signal.signal(signal.SIGUSR1, sch.abort) 
    sch.start() 

le problème est que je reçois un appel système Interrupted qui rend la sortie ftplib.FTP prématurément:

Traceback (most recent call last): 
    File "/root/my-applications/sensor/sensor/lib/importutils2.py", line 137, in connectAndCheckAll 
    try: self.checkAll() 
    ... 
    File "/usr/lib/python2.6/ftplib.py", line 182, in getline 
    line = self.file.readline() 
    File "/usr/lib/python2.6/socket.py", line 406, in readline 
    data = self._sock.recv(self._rbufsize) 
error: [Errno 4] Interrupted system call 

Donc gère mon script correctement, mais le signal programmé contrôle ne.

Pourquoi? Comment puis-je l'empêcher?

Merci pour votre soutien

Répondre

0

Je me suis trouvé la solution:

processus en cours d'exécution ftp dans un thread séparé isolait principaux signaux de processus

threading.Thread(target=self.checkAll).start()