Procesos (LINUX)

Procesos

Cada proceso en UNIX tiene asociado un número que lo identifica. Este número es asignado por el núcleo, y se denomina identificador de proceso o PID (process identitifier). Además del PID los procesos tienen asignado otro número denominado PPID (parent PID), que identifica el proceso padre.
Todo proceso, desde que se inicia hasta que termina, va pasando por una serie de estados, cada uno con unas características determinadas.
Estados:

  1. El proceso se está ejecutando. En máquinas con un sólo procesador sólo puede haber un proceso en ese estado. UNIX permite que la CPU sea compartida por varios procesos, dividiendo todo el tiempo del procesador en cuantos o rodajas, y asignado esos cuantos alternativamente a cada proceso, acorde con su prioridad.
  2. El proceso está durmiendo. Un proceso entra en este estado cuando no puede proseguir su ejecución por faltarle algún recurso o porque está esperando la terminación de una operación de entrada salida.
  3. El proceso no dispone del procesador, pero está listo para ejecutarse. Continuará su ejecución en cuanto se lo indique el planificador de la CPU.

Como hemos visto es posible ejecutar varios procesos de forma que parece que lo hacen simultáneamente, si estamos en la consola y ejecutamos un programa este no devuelve el prompt del shell hasta que no finaliza su proceso, para permitir que podamos ejecutar otros procesos será necesario enviar este primer proceso a segundo plano, lo cual se puede hacer de dos formas.

  1. Una vez que está en marcha pulsar ctrl+z lo que hará aparecer de nuevo el prompt y dejará el proceso en suspenso. Si queremos ponerlo en marcha debemos utilizar el comando bg <numero> donde numero indica el proceso que queremos pasar a segundo plano. Si en lugar de bg utilizamos fg <numero> lo que haremos será traer el proceso a primer plano y no podremos hacer otra cosa hasta que lo enviemos a segundo plano o lo paremos.
  2. Ejecutar un comando terminando la línea de orden con el símbolo &, el cual le indica al shell que ejecute la orden y que la pase a segundo plano.

Para saber que procesos se están ejecutando en un instante determinado podemos emplear la orden ps.
Si ejecutamos ps sin opciones nos devolverá los procesos asociados a nuestro terminal.

Para obtener más información debemos usar las distintas opciones que nos permite la orden ps aquí se exponen algunas de las más usadas.

-e         nos informa de todos los procesos que hay en el sistema.
-f         proporciona una lista completa de cada proceso.
-l          da listados largos y completos que contienen muchos detalles de los procesos
-a         muestra los procesos de otros usuarios.
-A        muestra todos los procesos
-x         muestra procesos sin ningún terminal asociado
-u         muestra el usuario y el tiempo de inicio.

Ejemplos:

USER              Usuario propietario del proceso.
PID                 Identificador del proceso.
%CPU             % de uso de los recursos de la CPU
%MEM           % de memoria utilizada.
VSZ                indica la cantidad de kilobytes del programa en la memoria virtual.
RSS                 indica la cantidad del kilobytes del programa en memoria.
TTY                terminal de control asociado al proceso.
STAT              información acerca del estado del proceso. R: listo; S: durmiendo; T: detenido; Z:                               Zombie (su proceso padre no los detuvo apropiadamente).
START            Hora de inicio del proceso.
TIME              Tiempo que lleva ejecutándose
COMMAND  Nombre del programa que contiene la imagen del proceso.

Otra orden que nos permite estudiar los procesos en ejecución es top.

También puede resultar muy útil utilizar la orden pstree que nos mostrará los procesos en forma de árbol permitiendo ver las dependencias de procesos padre e hijos.

Para enviar señales a los procesos en ejecución se utiliza la orden kill cuya sintaxis es:

kill -señal PID – Envia la señal al proceso indicado por PID.

Cuando un proceso recibe una señal puede actuar de tres formas diferentes:

  1. Ignorar la señal
  2. Invocar a la rutina de tratamiento por defecto proporcionada por el núcleo.
  3. Invocar una rutina propia que se encargará de tratar dicha señal.

Cada señal tiene asociado un número entero positivo que la identifica. En el caso del UNIX System V
existen 19 diferentes, numeradas del 1 al 19.

1        SIGHUP: Es enviada a todos los procesos asociados a un mismo terminal cuando se pulsa la tecla de interrupción. Por defecto provoca la terminación de los procesos que la reciben.
2        SIGINT: Interrupción. Es enviada a todos los procesos asociados a un mismo terminal cuando se pulsa la tecla de interrupción. Por defecto provoca la terminación de los procesos que la reciben.
3        SIGQUIT: Salir. Es similar a SIGINT, pero en este caso se envía cuando pulsamos la tecla de salida Ctrl-4.
5        SIGTRAP: Es enviada cuando se ejecutan instrucciones paso a paso en un programa. Por defecto provoca la terminación de los procesos que la reciben.
6        SIGIOT: Fallo de hardware
7        SIGEMT: Fallo de hardware
8        SIGFPE: Es enviada cuando el hardware detecta un error en una operación en coma flotante. Por defecto provoca la terminación de los procesos que la reciben.
9        SIGKILL: Provoca la terminación del proceso. Esta señal no puede ser ignorada.
10        SIGBUS: Error de acceso a memoria.
11        SIGSEGV: Violación de segmentos de memoria
12        SIGSYS: No se usa
13        SIGPIPE: Intento de escritura en una tubería en la cual no hay nadie leyendo.
14        SIGALARM: Es enviada al proceso cuando alguno de sus temporizadores llega a cero. Por defecto provoca la terminación de los procesos que la reciben.
15        SIGTERM: Indica que el proceso debe terminar. Puede ser ignorada.
16        SIGUSR1: Reservada para el usuario.
17        SIGUSR2: Reservada para el usuario.
18        SIGCLD: Se envía al padre de un proceso si éste muere.
19        SIGPWR: Fallo de alimentación.

Por defecto la orden kill envía la señal 15 al proceso especificado. Si queremos eliminar el proceso definitivamente lo mejor es enviarle la señal 9.