Bonjour,
Je souhaite lancer un check md5 de tout un dossier récursivement. Ce dossier contient environ 250 000 fichiers. Le md5 prend à peu près 7h. Je dois le lancer sur un dossier et son backup. Je lance les deux procédures en parallèles à l'aide de subprocess.
La commande lancée directement dans le terminal fonctionne, chaque fichier d'output (le fichier qui contient toutes les sommes md5) fait environ 25 Mo. La commande a fonctionné correctement quand je l'ai lancée directement dans le terminal.
Afin d'éviter les soucis de buffer, je redirige le stdout et stderr dans des fichiers directement, sans passer par subprocess.PIPE.
Voici le code :
Je lance le programme la nuit. Dans la pratique, je constate que les fichiers d'output backup_output et document_output n'ont pas été modifiés depuis plusieurs heures quand je me lève. Pourtant, le code tourne toujours, et il attend désespéremment que la première commande se termine. Quand je tue le script, il me retourne les informations suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 doc_command = ["md5deep", "-rl", "."] spare_command = ["md5deep", "-rl", "."] #################### document_output = open(os.path.join(documents, new_md5), 'w') document_error = open(os.path.join(documents, "md5_error.log"), 'w') # Currently, if we want relative paths to work in md5deep, we must specify "." # in the path. So we must chdir to the desired directory beforehand. # I submitted a bug issue, but to make this work, I did this trick. os.chdir(documents) doc_process = subprocess.Popen(doc_command, stdout=document_output, stderr=document_error) backup_output = open(os.path.join(backup, new_md5), 'w') backup_error = open(os.path.join(backup, "md5_error.log"), 'w') os.chdir(backup) spare_process = subprocess.Popen(spare_command, stdout=backup_output, stderr=backup_error) doc_code = doc_process.wait() log.info("%s [%d]" % (doc_command, doc_code)) spare_code = spare_process.wait() log.info("%s [%d]" % (spare_command, spare_code)) document_output.close() document_error.close() backup_output.close() backup_error.close() #######################
Je ne comprends absolument pas pourquoi ça plante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 ^CTraceback (most recent call last): File "./sync_storage.py", line 270, in <module> doc_code = doc_process.wait() File "/usr/lib/python2.7/subprocess.py", line 1376, in wait pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0) File "/usr/lib/python2.7/subprocess.py", line 476, in _eintr_retry_call return func(*args) KeyboardInterrupt
À noter que le fichier d'erreur de la commande doc_process est vide. Le fichier d'erreur de spare_process contient :
Mais dans le fichier d'output, d'autre md5 ont été calculés après ça, ce n'est donc pas ça qui bloque a priori.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 ./home_autiwa/.config/geany/geany_socket_autiwa-SSD__0: No such file or directory ./home_autiwa/.config/geany/geany_socket_autiwa-laptop__0: No such file or directory ./home_autiwa/.config/geany/geany_socket_autiwa-desktop_localhost_10: No such file or directory ./home_autiwa/.config/geany/geany_socket_autiwa-desktop__0: No such file or directory
Y-a-t-il des experts qui ont une idée de ce qu'il se trame dans mon programme? Mon plus gros soucis c'est que je n'ai rien à me mettre sous la dent pour débuguer. Je ne sais pas du tout comment aborder le problème. Je suis désespérément en quête d'une bonne âme qui pourrait m'apporter quelque lumière sur mon problème épineux.
Merci d'avance,
Autiwa
Partager