2014-05-17 2 views
1

Dans un script shell Je veux attendre un certain fichier à apparaîtreun accès sécuritaire des fichiers inotified

inotifywait -m -r -q -e close_write -e moved_to --format '%w/%f' $ARCHIVE_ROOT | while read FILE; do 
# Call other programs which process the file like stat or sha1sum 
done 

j'aurais supposé que le fichier soit valide alors que dans le code de gestion. Malheureusement, le fichier semble disparaître, par exemple. après avoir été traité par sha1sum. Ai-je manqué quelque chose d'évident, ce qui est nécessaire pour faire durer le fichier?

Répondre

1

De nombreux processus créent des fichiers temporaires et les suppriment rapidement. Telle est la nature du progrès.

Pour empêcher un fichier d'être supprimé pendant que votre boucle est exécutée, utilisez un lien dur:

inotifywait -m -r -q -e close_write -e moved_to --format '%w/%f' $ARCHIVE_ROOT | while read FILE; do 
    ln "$FILE" tmpfile$$ || continue 
    sha1sum tmpfile$$ 
    rm tmpfile$$ 
done 

Si le fichier est détruit avant votre boucle while commence, il n'y a rien que vous pouvez faire. Si, cependant, il existe au début de la boucle, l'utilisation d'un lien physique fera en sorte qu'il continue d'exister aussi longtemps que vous en avez besoin.

Le lien dur avec ne pas arrêter d'autres processus de modifier le fichier. Si c'est un problème, alors une copie (cp) est nécessaire.

Pour que cela fonctionne, le fichier temporaire doit être sur le même système de fichiers que l'original.

Si cette application est sensible à la sécurité, vous pouvez utiliser mktemp ou un autre utilitaire pour générer le nom du fichier temporaire.

+0

Ainsi, 'inotifywait' devrait plutôt retourner le chemin et l'inode du fichier pour fonctionner en toute sécurité! – abergmeier

+0

Avoir l'inode ne résout toujours pas le problème si le fichier a déjà été supprimé avant que le script inotifywait ait une chance de s'exécuter. – John1024

+0

Correct, mais je supposerais que l'inode doit être renvoyé (par inotify) jusqu'à ce que tous les rappels d'inotify aient été appelés. – abergmeier

Questions connexes