Verrous et accès concurrents aux fichiers

Empêcher deux instances d'un script de se marcher dessus : la course, le défaut tester puis agir, les opérations atomiques, mkdir, set -C, flock, le verrou resté après un plantage et l'écriture par fichier temporaire puis renommage.

  • 30 cartes
  • 5 thèmes
  • Gratuit

Le programme, thème par thème

Le poids de chaque thème suit celui que lui donne l'examen.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Mises en situation
  5. Comprendre

Quelques cartes du deck

  • Situation de course : de quoi s'agit-il ?

    Voir la réponse

    Défaut où le résultat dépend de l'ordre, imprévisible, dans lequel deux exécutions simultanées enchaînent leurs instructions.

    Elle se manifeste rarement et au pire moment, ce qui la rend difficile à reproduire. Deux instances d'un script qui testent puis créent un verrou peuvent toutes deux passer le test.

  • Pourquoi deux instances de ce script peuvent-elles traiter en même temps ?

    ```bash
    if [ ! -e verrou ]; then
    touch verrou
    traiter
    rm verrou
    fi
    `

    • La seconde peut passer le test avant que la première ait fait touch
    • rm verrou s'exécute avant touch dans la seconde instance
    • Le test -e ne regarde que les répertoires et jamais les fichiers ordinaires
    • touch ne crée le fichier que si traiter s'est terminé sans erreur
    Voir la réponse

    La seconde peut passer le test avant que la première ait fait touch

    Le test et le touch sont deux instructions : entre les deux, l'autre instance voit aussi que verrou n'existe pas. Il faut une seule opération qui teste et crée, comme mkdir.

  • Avec bash, set … (noclobber) fait échouer une redirection > vers un fichier qui existe déjà : la création du fichier devient atomique.

    Voir la réponse

    Avec bash, set -C (noclobber) fait échouer une redirection > vers un fichier qui existe déjà : la création du fichier devient atomique.

    Le message est « cannot overwrite existing file » et le code vaut 1. C'est un verrou sans mkdir : set -C; echo $$ > verrou.

  • Tester puis agir : de quoi s'agit-il ?

    Voir la réponse

    Défaut où l'état vérifié (le fichier n'existe pas) a changé quand on agit en s'y fiant, parce que la vérification et l'action sont deux instructions distinctes.

    Dans [ -e verrou ] || touch verrou, un autre processus peut créer verrou entre les deux. Le remède est une opération unique qui teste et agit ensemble : mkdir, flock.

  • Le site lit parfois un fichier de configuration à moitié écrit. Le script de déploiement le régénère avec generer > config.json. Quelle est la cause, et la solution ?

    • Le site lit trop vite après le déploiement : lui faire attendre quelques secondes avant de rouvrir le fichier
    • Le fichier est trop gros pour une seule écriture : le découper en plusieurs fichiers plus petits à assembler
    • L'écriture en place tronque le fichier puis le remplit : écrire à côté dans un fichier temporaire du même dossier, puis mv
    • Le système de fichiers est corrompu : le démonter, le réparer avec fsck puis relancer tout le script de déploiement du site
    Voir la réponse

    L'écriture en place tronque le fichier puis le remplit : écrire à côté dans un fichier temporaire du même dossier, puis mv

    Dès que > ouvre le fichier, son ancien contenu disparaît et le nouveau arrive par morceaux : un lecteur peut tomber au milieu. Le renommage, lui, remplace le fichier d'un seul coup.