MANEJO DE PROCESOS

CONCEPTO DE PROCESO

Para comprender la manera en la cual el shell ejecuta los comandos, se debe tener en cuenta las circunstancias siguientes:

Una función es una secuencia de comandos identificada por un nombre unívoco. En caso de no encontrar ninguna con ese nombre, verifica si se trata de un comando interno (exit, exec, trap, etc.) o palabra reservada (case, do, done, if, for, etc.), para ejecutarlo o pedir más entrada. Si ninguna de estas condiciones es cierta, el shell asume que lo que se ha escrito es un comando, y lo busca dentro de los directorios contenidos en la variable de entorno PATH. Si no está, se muestra un mensaje del tipo "XXXX: not found", siendo XXXX lo que se ha escrito.

Por ej. si escribe:

$ hola

Suponiendo que la variable PATH contenga los directorios /bin/usr/bin y /etc, el shell busca el comando "/bin/hola", "/usr/bin/hola" y "/etc/hola". Ya que no existe, la respuesta será:

sh : hola: not found

El shell utiliza el kernel para la ejecución de procesos, los cuales quedan bajo su control. Es posible definir un proceso como un programa en ejecución. Ya que UNIX es multitarea, utiliza una serie de métodos de "tiempo compartido" en los cuales parece que hay varios programas ejecutándose a la vez, cuando en realidad lo que hay son intervalos de tiempo cedidos a cada uno de ellos según un complejo esquema de prioridades.

 

 

COMANDO ps

Cuando el shell lanza un programa, se crea un nuevo proceso y se le asigna un número entero (PID) entre 1 y el 30.000, del cual se tiene la seguridad que va a ser unívoco mientras dure la sesión. Se puede verificar ejecutando el comando "ps", el cual muestra los procesos activos que tiene asociados a la terminal.

Un proceso que crea a otro se lo denomina proceso padre. El nuevo proceso, en este ámbito se le denomina proceso hijo. Este hereda casi la totalidad del entorno de su padre (variables, etc.), pero sólo puede modificar su entorno, y no el del padre.

La mayoría de las veces, un proceso padre se queda en espera de que el hijo termine, esto es lo que sucede cuando se lanza un comando, el proceso padre es el shell, que lanza un proceso hijo (el comando).

Cuando este comando acaba, el padre vuelve a tomar el control, y recibe un número entero donde recoge el código de retorno del hijo (0 = terminación sin errores, otro valor = aquí ha pasado algo).

Cada proceso posee también un número de "grupo de procesos". Procesos con el mismo número forman un solo grupo y cada terminal conectado en el sistema posee un solo grupo de procesos. (Comando ps -j) si uno de nuestros procesos no se halla en el grupo asociado al terminal, recibe el nombre de proceso en background (segundo plano).

Es posible utilizar algunas variantes del comando "ps" para ver qué procesos se tiene en el equipo:

ps : muestra el número de proceso (PID), el terminal, el tiempo en ejecución y el comando. Sólo informa de nuestra sesión.

ps -e : de todas las sesiones.

ps -f : full listing: da los números del PID, del Ppid (padre), uso del procesador y tiempo de comienzo.

ps -j: da el PGID (número de grupo de los procesos - coincide normalmente con el padre de todos ellos).

 

 

COMANDO kill

Este comando puede servirnos para matar o anular procesos indeseados. Se debe tener en cuenta que cada proceso lleva su usuario y por tanto solo él (o el superusuario) pueden matarlo.

Normalmente, si los programas que componen el grupo de procesos son civilizados, al morir el padre mueren todos ellos siempre y cuando el padre haya sido "señalizado" adecuadamente. Para ello, se emplea el comando

kill <número de señal> PID

siendo PID el número del proceso o del grupo de procesos.

Los números de señal utilizados mas frecuentemente son:

-15: TERM o terminación. Se manda para que el proceso cancele ordenadamente todos sus recursos y termine.

-1: corte.

-2: interrupción.

-3: quit.

-5: hangup.

-9: kill: la más enérgica de todas pero no permite que los procesos mueran ordenadamente. El proceso que la recibe finaliza inmediatamente.