2016-12-23 3 views
1

Je possède ce fragment de code dans une fonction bash:

while ! mkdir lock ; do 
    inotifywait -t $WAIT_TIMEOUT -e delete_self lock 
done 
local es=$? 
if (($es != 0)); then 
    echo "Checkpoint A" 
    exit $es 
fi 

Je pensais que ce point de contrôle A serait complètement inaccessible (depuis une mkdir réussie doit sûrement être la dernière commande exécutée lorsque la boucle while se termine). Cependant, je constate que parfois, le point de contrôle A est atteint. Comment est-ce possible, même en principe?

+1

(pour une raison particulière, vous utilisez le verrouillage par répertoire plutôt que flock?) Ce dernier est non seulement moins de code, mais - plus important encore - se déverrouille automatiquement lorsque le processus contenant le verrou FD se termine , même par perte de puissance ou autre condition impropre/inattendue). –

+1

(deuxième côté: vous pouvez envisager de citer vos expansions sans condition, même si vous savez qu'il n'y a pas d'espaces présents dans les valeurs. '-t" $ WAIT_TIMEOUT "' autorisera un message d'erreur plus utile si la valeur est inopinément '- t $ WAIT_TIMEOUT' étant donné que le premier vérifie qu'une chaîne vide est passée dans le slot, le comportement avec un IFS non-par défaut peut être encore plus surprenant, ce qui pourrait amener une valeur de '101' à se développer en deux mots séparés si' IFS = 0'). –

+0

@CharlesDuffy Merci pour le conseil. Je suis un débutant complet pour Linux et j'ai une aversion pour l'utilisation d'outils que je suspecte "avoir des problèmes". Le ton de [ceci] (http://0pointer.de/blog/projects/locking.html) m'a découragé, pour le meilleur ou pour le pire. – Museful

Répondre

5

De la section 2.9.4 de http://pubs.opengroup.org/onlinepubs/9699919799/ regardint l'état de sortie d'une boucle while:

L'état de sortie de la boucle tandis que sera l'état de sortie de la dernière composé-list-2 exécuté, ou zéro si aucun n'a été exécuté.

(Ici, « composé-list-2 » sont les commandes à l'intérieur de la partie do...done de la boucle de temps.) Ainsi, la valeur de $? sera le résultat retourné la dernière fois inotifywait exécuté, ou zéro si elle est jamais appelé.