1 votos

cerrar un comando específico de la Terminal de GNOME

Puedo ejecutar un bucle como este (duración una hora):

#!/bin/bash
gnome-terminal --geometry=50x30 --working-directory=/$HOME/TEST --title terminal1 -e  ' sh -c "./FirstAPP; exec bash"'
while true; do
    if [ ! pgrep SecondAPP ]; then
        gnome-terminal --geometry=50x30 --working-directory=/$HOME/TEST --title terminal2 -e  ' sh -c "./SecondAPP; exec bash"'
        for ((i=0; i<3600; i+=5)); do
            sleep 5
            if [ ! pgrep SecondAPP ]; then
                break
            fi
        done
        killall -9 SecondAPP > /dev/null 2>&1 
    # Iwant here a command that closes the gnome-terminal "terminal2"
    fi
    sleep 5
done

Puedo ejecutar este bucle y me di cuenta de que en el terminal2 el proceso murieron, pero el terminal se queda abierto. Hay una flag o algo a cerca de que terminal2?

O se trata de la aplicación incorrecta?

PS. Soy un novato en Ubuntu, miré el cierre de un terminal en concreto, sin embargo yo no creo que sea apllies a mi caso.

1voto

Stewart Puntos 1385

Están matando el programa SeondApp, pero que no están matando a la terminal se ejecuta en. Los dos son cosas separadas. Por ejemplo, este es el árbol de procesos de ejecución gedit en un terminal:

$ gedit &
[1] 13064
$ pstree -s 13064
systemd───systemd───gnome-terminal-───bash───gedit───4*[{gedit}]

Ignorar la systemd, que es el init proceso, todo lo que se ejecuta en su máquina es un hijo de systemd. Entonces, lo que se ve hay que gnome-terminal ha lanzado bash que, a continuación, ejecuta gedit. Si matan a gedit, que no afectará a sus padres. Sin embargo, si usted matar a uno de los padres, que también va a matar al niño.

Normalmente, lo que haría es usar $!, un especial de variable que contiene el PID del último proceso se puso en marcha el fondo. Por desgracia, no con gnome-terminal que parece tener algún tipo de complicado el lanzamiento de procedimiento:

$ gnome-terminal &
[1] 23861
$ ps aux | grep 23861
terdon   24341  0.0  0.0   8684  2348 pts/11   S+   10:59   0:00 grep --color 23861
$ pgrep gnome-terminal
23866

Como se puede ver arriba, gnome-terminal parecen re-lanzamiento en sí mismo después de su lanzamiento y utiliza un PID diferente. Ni idea de por qué, pero otra buena razón para usar un terminal diferente.

Así, desde el enfoque estándar no funciona, necesitamos una solución. Lo que puedes hacer es usar kill -$PID que se kil de todos los procesos en el proceso de grupo (en man kill):

-n  where n is larger than 1.  All processes in process  group  n  are
    signaled.   When  an argument of the form '-n' is given, and it is
    meant to denote a process group, either a signal must be specified
    first,  or  the argument must be preceded by a '--' option, other‐
    wise it will be taken as the signal to send.

Poniendo todo esto junto, esto es una versión de trabajo de la secuencia de comandos:

#!/bin/bash
gnome-terminal --geometry=50x30 --working-directory=/$HOME/TEST --title terminal1 \
               -e  ' sh -c "./FirstAPP; exec bash"'
while true; do
    if ! pgrep SecondAPP; then
        gnome-terminal --geometry=50x30 --working-directory=/$HOME/TEST \
            --title terminal2 -e  'SecondAPP' &
        for ((i=0; i<3600; i+=5)); do
          sleep 5
          if ! pgrep SecondAPP; then
            break
          fi
        done
        ## Now, get the PID of SecondAPP
        pid=$(pgrep SecondAPP)
        ## Using -$pid will kill all process in the process group of $pid, so
        ## it will kill SecondAPP and its parent process, the terminal.
        kill -- -$pid
    fi
    sleep 5
done

Tenga en cuenta que yo también quitar el [ ] de todo ! pgrep desde que estaba mal de la sintaxis.


No veo por qué usted está lanzando terminales a todos aunque. Aquí está la misma idea, sin terminales:

#!/bin/bash

$HOME/TEST/FirstAPP
while true; do
    if ! pgrep SecondAPP; then
      #$HOME/TEST/SecondAPP &
      SecondAPP &
      pid=$!
        for ((i=0; i<3600; i+=5)); do
          sleep 5
          if ! pgrep SecondAPP; then
            break
          fi
        done
        kill $pid
    fi
    sleep 5
done

Finalmente, esto se siente como una extraña manera de hacer las cosas. Usted podría querer hacer una nueva pregunta, explique lo que usted está tratando de hacer y por qué y podemos ver si podemos encontrar un enfoque más sencillo para lo que se necesita.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: