Flock & exec est-il sûr en bash?

13

L'extrait de verrouillage "standard" que j'ai vu va quelque chose comme ...

(
    flock -n 200 || exit 1;
    # do stuff
) 200>program.lock

Est-il sûr (les tests semblent le dire) d'utiliser execà ce stade? Le sous-processus conservera-t-il le verrou?

(
    flock -n 200 || exit 1;
    exec /usr/bin/python vendors-notcoolstuff.py
) 200>program.lock

Je me souviens vaguement que les processus exécutés conservent des descripteurs de fichiers ouverts et puisque flock utilise des descripteurs de fichiers, cela devrait fonctionner. Mais je ne trouve aucune documentation qui rend cela définitif et clair.

Pour mémoire, ceci est spécifique à Linux.

Danny
la source

Réponses:

3

Oui, les verrous sont conservés partout exec. Les verrous sont conservés sur l'appel système sous-jacent execve, tant que le descripteur de fichier reste ouvert. Les descripteurs de fichiers restent ouverts dans tous les cas execvesauf s'ils ont été configurés pour être fermés lors de l'exécution, et les descripteurs de fichiers créés par la redirection de shell ne sont pas marqués comme fermés lors de l'exécution.

Gilles 'SO- arrête d'être méchant'
la source
6

Oui, ça l'est. Exec remplace simplement l'image de processus, mais c'est toujours le même processus, de sorte que les verrous au niveau du système d'exploitation qui lui sont associés restent les mêmes.

Il est très facile de vérifier que cela fonctionne:

fermer à clé

(
    flock -n 200 || exit 1;
    echo "locked"
    exec ./script
) 200>program.lock

scénario

sleep 100

Essayez de courir ./lockdeux fois dans les 100 secondes suivantes. Vous n'aurez le verrou qu'une seule fois, ergo execne le relâche pas.

PSkocik
la source