La responsabilidad del arranque de la terminal es del usuario hacia el kernel usando el entorno de ventanas o el shell como intermediarios.
Entonces... no se puede evitar el arranque de la terminal si no te pones en medio de esa conversación.
Se puede hacer que no lo arranque desde el entorno gráfico si se quitan todas las referencias (iconos, menús) donde aparece el atajo para el arranque de la terminal.
Y en el shell... se podría crear un alias que se llame de la misma manera que el ejecutable, y así el usuario, si no se da cuenta, verá que no aparece nada en pantalla.
Pero un programa en ejecución como el que tú planteas, no impedirá el arranque del terminal. Si puede matarlo una vez detectado (con el kill, como tienes puesto). Entonces, lo que te queda hacer es un bucle infinito, pero en lugar de leer líneas desde un stdout abierto, debes ejecutar el 'ps ...' (por ejemplo, cada un segundo o cada 3 segundos, para que no cargue la CPU), y encauzar los pid encontrados al kill.
Por ejemplo:
#!/usr/bin/python
import time, sys, subprocess,os
while True:
time.sleep(1) # esperamos un poco
comando = "ps -eo pid,cmd | fgrep konsole | fgrep -v fgrep | awk {'print $1;'}"
proceso = subprocess.Popen(comando , shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
next_line = proceso.stdout.readline()
if next_line != '':
comando = "kill -9 " + next_line;
proceso = subprocess.Popen(comando , shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
(He cambiado gnome-terminal por Konsole, ya que es el terminal en mi entorno KDE). (Nota la presencia de un
fgrep -v fgrep para evitar que hagamos un kill del primer fgrep).
No estoy muy ducho en Python, pero seguro que la ejecución de comandos externos en Python debería requerir menos texto.
La versión de Perl es más liviana:
#!/usr/bin/env perl
do {
if ($terminal = qx(/bin/ps -eo pid
,cmd
| fgrep konsole
| fgrep
-v fgrep
| awk
'{print \$1}')) { system('kill', '-9', $terminal); }
} while ("forever");
Gracias por la ayuda, pero hay un problema, al ejecutar el archivo .py/.perl si es cierto que me cierra el terminal/terminales los cuales estan abiertos en ese momento, pero luego me sigue dejando abrirlos si hago por ejemplo Ctrl+Alt+T. Mi intencion es que mientras ese script se este ejecutando al abrir el terminal detecte el proceso y lo mate
A ver si logras echarme una mano
Un saludo