2011-07-13 8 views
6

puedo fácilmente iniciar un proceso de fondo, encontrar su PID y buscarla en la lista de procesos en ejecución.para una PID de un fondo de procesar gnome-terminal

$gedit & 
$PID=$! 
$ps -e | grep $PID 

Esto funciona para mí. Pero si comienzo gnome-terminal como el proceso en segundo plano

$gnome-terminal & 
$PID=$! 
$ps -e | grep $PID 

Entonces, no se encuentra en la lista de todos los procesos en ejecución.

Me estoy perdiendo algo aquí?

Respuesta

5

Esto parece ser debido a que el proceso de gnome-terminal de empezar inicia un proceso en sí mismo y luego se cierra. Entonces, el PID que captura es el pid del proceso "stub" que se inicia y luego bifurca el terminal real. Hace esto para que pueda desconectarse por completo del terminal que llama.

Desafortunadamente no sé de ninguna manera de capturar el pid del proceso gnome-terminal "granchild", que es la que deja encendido. Si haces un ps, verás el proceso "nieto" del gnome-terminal ejecutándose con un pid padre de 1.

1

(Esto es solo una nota al pie) Como dijo @Sodved, gnome-terminal inicia un proceso y luego sale , no hay forma de obtener el nieto pid. (Consulte también APUE Capítulo 7 por qué un proceso hijo no se volverá a conectar al proceso de abuelos cuando finalizó su proceso principal).

Encontré que gnome-terminal crea instancias solo una vez, por lo que aquí hay solo un breve guión para su tarea específica:

GNOME_TERMINAL_PID=`pidof gnome-terminal` 

Si usted no tiene pidof:

GNOME_TERMINAL_PID=`grep Name: */status | grep gnome-terminal | cut -d/ -f1` 
9

Si se utiliza la opción "--disable-fábrica" ​​gnome-terminal que es posible usar gnome-terminal en la forma en que deseas. De forma predeterminada, intenta utilizar un terminal ya activo, por lo que esto le permitirá obtener el pid del que ejecuta. La siguiente secuencia de comandos se abre una ventana de 5 segundos, y luego lo mata:

#!/bin/bash 
echo "opening a new terminal" 
gnome-terminal --disable-factory & 
pid=$! 
echo "sleeping" 
sleep 5; 
echo "closing gnome-terminal" 
kill -SIGHUP $pid 
Cuestiones relacionadas