2012-12-08 2 views
1

J'ai un répertoire avec des milliers de fichiers et chacun d'eux doit être traité (par un script python) et ensuite supprimé.Plusieurs processus de lecture et de suppression de fichiers dans le même répertoire

Je voudrais écrire un script bash qui lit un fichier dans le dossier, le traite, le supprime et passe à un autre fichier - l'ordre n'est pas important. Il y aura n instances en cours d'exécution de ce script bash (par exemple 10), toutes fonctionnant sur le même répertoire. Ils quittent lorsqu'il n'y a plus de fichiers dans le répertoire. Je pense que cela crée une condition de concurrence. Pourriez-vous me donner un conseil (ou un extrait de code) pour vous assurer que deux scripts bash ne fonctionnent pas sur le même fichier? Ou pensez-vous que je devrais plutôt mettre en œuvre le multithreading en Python (au lieu d'exécuter n différents scripts bash)?

Répondre

1

Vous pouvez utiliser le fait que les fichiers renommés (sur le même système de fichiers) sont atomiques sur les systèmes Unix, c'est-à-dire qu'un fichier a été renommé ou non. Par souci de clarté, supposons que tous les fichiers que vous devez traiter aient un nom commençant par A (vous pouvez éviter cela en ayant un dossier séparé pour les fichiers que vous traitez en ce moment).

Ensuite, votre script bash itère sur les fichiers, essaie de les renommer, appelle le script python (je l'appelle ici process) s'il réussit et continue. Comme ceci:

#!/bin/bash 

for file in A*; do 
    pfile=processing.$file 
    if mv "$file" "$pfile"; then 
     process "$pfile" 
     rm "$pfile" 
    fi 
done 

Cet extrait utilise le fait que mv retourne un code de sortie 0 si elle a été en mesure de déplacer le fichier et un code de sortie non nul autre.

1

Le seul moyen sûr que deux scripts n'agissent pas sur le même fichier en même temps est d'utiliser un mécanisme de verrouillage de fichier. Une façon simple de le faire pourrait être de renommer le fichier avant de commencer le travail, en ajoutant une chaîne connue au nom du fichier. Le travail est ensuite terminé et le fichier supprimé. Chaque script teste le nom du fichier avant de faire quoi que ce soit et passe à autre chose s'il est 'spécial'.

Une approche plus complexe consisterait à conserver un fichier temporaire contenant les noms des fichiers en cours de traitement. Ce fichier devrait évidemment être retiré une fois que tout est fini.

Questions connexes