Je voudrais exécuter un script de collecte de données qui, pour chaque boucle:
ouvrir de nouveaux terminaux pour y exécuter des processus de simulation de robot
lancer un autre process2 dans le terminal parent
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:
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).
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.