Rastreie e feche os terminais filhos. Poupe o pai

5

Eu gostaria de executar um script de coleta de dados que, para cada loop:

  1. abrir novo (s) terminal (is) para executar processos de simulação de robô neles

  2. execute outro processo2 no terminal pai

  3. 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:

  1. 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?
  2. 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).

    
por Vicon 25.01.2017 / 23:15

1 resposta

2

Em vez de fechar os terminais, eu recomendo que você de alguma forma termine (por exemplo, mate) os processos em execução dentro deles. Estes são seus processos de simulação de robôs, iniciados por você, então você deve conhecer o PID que pertence a eles.

Dado o padrão de cada emulador de terminal, que é fechar a si mesmo quando o processo solicitado (ou seja, ./robot_sim ) terminar, isso resultará no fechamento dessas janelas ou abas de terminal.

    
por egmont 26.01.2017 / 15:11