web-dev-qa-db-fra.com

Suivre et fermer les terminaux pour enfants. Épargner le parent

Je voudrais exécuter un script de collecte de données qui, pour chaque boucle:

  1. ouvrir de nouveaux terminaux pour y exécuter des processus de simulation de robot

  2. lancer un autre process2 dans le terminal parent

  3. lorsque le processus2 est terminé, fermez tous les terminaux du simulateur ouverts à l'étape 1

J'ai lu beaucoup d'autres questions et réponses ici sur la fermeture des terminaux. Ce qui me pose problème, c'est que je veux garder mon terminal parent ouvert avec le processus parent en cours d'exécution à tout moment. Idéalement, j'aimerais pouvoir suivre chaque terminal enfant ouvert par mon script, de sorte que je puisse choisir de le fermer ultérieurement. Cependant, je peux aussi vivre avec la fermeture de tous les autres terminaux sans vérifier s'ils sont les enfants du script actuel, si cela me facilitera la vie.

J'ai une connaissance très limitée de la manière dont chaque terminal est identifié. Je sais que chaque processus a un ID de processus, mais qu'en est-il d'un terminal? Quand et en quoi cela diffère-t-il d'un processus (veuillez vous reporter à l'exemple ci-dessous qui crée une confusion quant à l'identification du terminal/du processus)?

J'ai essayé d'écrire le script ci-dessous en utilisant les réponses d'autres questions/réponses.

parent_terminal=$(xdotool getactivewindow)
echo "parent_terminal: $parent_terminal"

# TODO: start external loop

    # open a child terminal(s) and run robot_sim there
    #(gnome-terminal -e './robot_sim') 
    #echo $! --> gives blank.. 

    #./process2
    #echo "process2 done. Killing robot_sim.."

    # Kill all other terminals except this one (the parent)
    xdotool search --class "terminal" | while read id
    do
          if [ "$id" -eq "$parent_terminal" ]; then
            echo "This is parent_terminal $parent_terminal"
            echo "Do not kill $id"
            continue
          else
            echo "This is NOT parent_terminal $parent_terminal"
            echo "Killing $id"
            xdotool windowactivate "$id" &>/dev/null # Make the terminal with $id active
            xdotool key ctrl+shift+q # Kill terminal by simulating a key press
            #sleep 0.2
          fi
    done 

# done external loop

J'ai essayé d'exécuter le script ci-dessus en commençant par ouvrir un autre terminal vierge à côté du terminal actuel (donc 2 au total). Voici le résultat:

  1. La sortie (ci-dessous) répertorie 3 terminaux, le script essayant de fermer le terminal parent (une fenêtre contextuelle me confirmant la mise à mort). Pourquoi liste-t-il 3 et pas 2 terminaux? Il semble que le terminal parent donne 2 identifiants différents. Quels sont ces identifiants?
  2. La moitié du temps, l'autre terminal vierge est fermé avec succès, mais parfois, il ne tue même pas l'autre terminal (même si, en fonction de la sortie, il aurait dû tenter de tuer 2 des 3 terminaux répertoriés).
parent_terminal: 62914571 
This is NOT parent_terminal 62914571 
Killing 62914561 
This is NOT parent_terminal 62914571 
Killing 62920887 
This is parent_terminal 62914571 Do not kill 62914571

De même, si je teste le script avec un seul terminal (le parent) ouvert, il répertorie 2 terminaux et tente de fermer le parent:

parent_terminal: 62914571 
This is NOT parent_terminal 62914571 
Killing 62914561 
This is parent_terminal 62914571 
Do not kill 62914571

Ajouté: J'ai également consulté cette question: Fermeture d'un terminal spécifique , et j'ai essayé d'exécuter la commande ci-dessous dans quelques terminaux que j'ouvre manuellement.

$ cat /proc/$$/status | grep PPid

Cependant, tous les terminaux me donnent le même identifiant (PPid: 2298).

5
Vicon

Au lieu de fermer les terminaux, je vous recommande de mettre fin d'une manière ou d'une autre (par exemple, kill) aux processus qui y sont exécutés. Ce sont vos processus de simulation de robot, démarrés par vous, vous devez donc connaître le PID qui leur appartient.

Étant donné la valeur par défaut de chaque émulateur de terminal, qui consiste à se fermer lorsque le processus demandé (c'est-à-dire ./robot_sim) se termine, cela entraînera la fermeture de ces fenêtres ou de ces onglets.

2
egmont