Eu gostaria de executar um script de coleta de dados que, para cada loop:
-
abrir novo (s) terminal (is) para executar processos de simulação de robô neles
-
execute outro processo2 no terminal pai
-
quando o processo2 terminar, feche todos os terminais do simulador abertos no passo 1
Eu li muitos outros Q & amp; A aqui sobre o fechamento de terminais. O que eu luto com é que eu quero manter o meu terminal pai aberto com o processo pai em execução em todos os momentos. Idealmente, gostaria de poder rastrear cada terminal filho que meu script abre, de modo que eu possa optar por fechá-los mais tarde. No entanto, eu também posso viver com apenas fechar todos os outros terminais sem verificar se eles são os filhos do script atual, se isso facilitar minha vida.
Eu tenho conhecimento muito limitado sobre como cada terminal é identificado. Eu sei que cada processo tem um ID de processo, mas que tal um terminal? Quando e como isso é diferente de um processo (por favor, veja o exemplo abaixo que me dá confusão sobre identificação de terminal / processo)?
Eu tentei escrever o script abaixo usando as respostas de outros Q & amp;
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
Eu tentei executar o script acima inicialmente com outro terminal em branco aberto ao lado do atual (so, 2 total). Aqui está o resultado:
- A saída (abaixo) lista 3 terminais, com o script tentando fechar o terminal pai (dando-me uma janela pop-up para confirmar a eliminação). Por que ele lista 3 e não 2 terminais? Parece que o terminal pai dá 2 IDs diferentes. Quais são esses IDs?
- Ele metade do tempo fecha com sucesso o outro terminal em branco, mas às vezes nem mesmo mata o outro terminal (embora, com base na saída, ele tenha tentado matar 2 dos 3 terminais listados).
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
Da mesma forma, se eu testar o script com apenas um terminal (pai) aberto, ele listará dois terminais e tentará fechar o pai:
parent_terminal: 62914571
This is NOT parent_terminal 62914571
Killing 62914561
This is parent_terminal 62914571
Do not kill 62914571
Adicionado: Eu também vi este Q & amp; A: Fechando um terminal específico , e tentei executar o comando abaixo em alguns terminais que abro manualmente.
$ cat /proc/$$/status | grep PPid
No entanto, todos os terminais me fornecem o mesmo ID (PPid: 2298).