Lancer des tâches en parallèle

Lancer des tâches de fond avec &, les attendre avec wait en gardant leur code de retour, comprendre le sous-shell et ses variables perdues, borner le parallélisme avec xargs -P et prévoir le gain avec la loi d'Amdahl.

  • 35 cartes
  • 6 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. Les étapes
  5. Mises en situation
  6. Comprendre

Quelques cartes du deck

  • Tâche de fond : de quoi s'agit-il ?

    Voir la réponse

    Commande lancée avec une esperluette finale : le shell ne l'attend pas et rend la main aussitôt ; la variable $! donne son numéro de processus.

    sleep 30 & rend la main tout de suite. Sans wait, un script qui se termine laisse ses tâches de fond derrière lui, sans en connaître le résultat.

  • Qu'affiche ce script Bash ?

    ```bash
    n=0
    ( n=5 ) & wait
    echo $n
    `

    • 0
    • 5
    • 1
    • n
    Voir la réponse

    0

    ( n=5 ) s'exécute dans un sous-shell qui travaille sur une copie de n : le shell parent garde 0. wait n'y change rien, il attend seulement la fin.

  • La variable $! contient le … de la dernière commande lancée en ….

    Voir la réponse

    La variable $! contient le PID de la dernière commande lancée en arrière-plan.

    Il faut la copier tout de suite (pid=$!) : le lancement suivant l'écrase.

  • wait : de quoi s'agit-il ?

    Voir la réponse

    Commande interne qui bloque le shell jusqu'à la fin de tâches de fond ; avec un PID, elle rend le code de retour de cette tâche.

    Sans argument, elle attend toutes les tâches et rend toujours 0, quels que soient leurs échecs. Pour détecter une erreur, il faut un wait par PID.

  • Sauvegarder quatre serveurs en parallèle et compter les échecs : quelle étape vient après « Lancer chaque sauvegarde avec & dans une boucle » ?

    • Parcourir la liste des PID avec une seconde boucle
    • Faire wait PID pour chacun et lire son code de retour
    • Incrémenter un compteur à chaque code non nul
    • Copier $! dans la liste des PID après chaque lancement
    Voir la réponse

    Copier $! dans la liste des PID après chaque lancement

    Les PID doivent être gardés avant de les attendre ; le compteur est incrémenté dans le shell principal, pas dans un sous-shell, pour qu'il survive à la boucle.