siguiente arriba anterior
Siguiente: Transferencia de archivos entre Arriba: Procesos y control de Anterior: Remitir trabajos

Control de trabajos

El primer mandato interesante es ps (process status). Su sintaxis, con sus opciones más importantes son:

ps Muestra los proceso activos del usuario en la sesión en la que se ejecuta el mandato ps.
ps -f Idem del anterior pero expandiendo la información y mostrando cada mandato completo (full).
ps -u usuario Muestra todos los procesos de un usuario.
ps -e Muestra todos los procesos del sistema entero.
ps -l Idem de ps mostrando toda la información de los procesos.

Las opciones anteriores se pueden combinar, y el resultado es una tabla donde los principales descriptores, en virtud de las opciones de ps, son los son los siguientes:

S Estado del proceso:
0$\rightarrow$en ejecución,
R$\rightarrow$listo (ready),
S$\rightarrow$esperando un evento (sleeping),
T$\rightarrow$parado (stopped),
Z$\rightarrow$finalizado pero aun con recursos (zombie).
UID Número de identificación de usuario.
PID Número de identificación de proceso.
PPID Número de identificación del proceso padre.
PRI Número que indica en qué medida puede bajarse la prioridad de un proceso.
TTY Terminal al que está asociado el proceso.
CMD El mandato que lanzó el proceso.

El PID resulta muy útil para averiguar la relación de parentesco entre procesos. Supongamos la siguiente secuencia de operaciones:

  1. acroread raiz.pdf &
    El usuario perico lanza desde el shell el lector acrobat en background.
  2. vim s5.tex
    A continuación lanza el editor vi sobre un archivo.
  3. :sh
    Dentro del vi sale temporalmente del editor.
  4. ps -fl | more
    Ejecuta ps página a página con more.

  F S UID     PID PPID C PRI NI ADDR   SZ WCHAN  STIME TTY       TIME CMD
000 S perico  709  707 0  60  0    -  439 wait4  09:44 pts/1 00:00:00 -bash
000 S perico  869  709 0  60  0    - 1457 do_sel 10:42 pts/1 00:00:02 acroread r.pdf
000 S perico  944  709 0  60  0    - 1215 wait4  11:00 pts/1 00:00:00 vim s5.tex
000 S perico  945  944 0  77  0    -  450 wait4  11:00 pts/1 00:00:00 /bin/bash
000 R perico 1252  945 0  77  0    -  629 -      15:52 pts/1 00:00:00 ps -fl
000 S perico 1253  945 0  77  0    -  280 pipe_r 15:52 pts/1 00:00:00 more

Apartir de los datos sobre PID y PPID sabemos que los procesos están emparentados según el gráfico de la figura [*].

Figura: Árbol de parentesco de varios procesos.
\includegraphics{arbolpro.eps}

Además podemos ver en la columna S que salvo el proceso ps -fl, que está listo para ejecución, todos los procesos están a la espera de una señal. La prioridad (PRI) es mayor en los tres últimos procesos. La bondad de cada proceso (NI) es 0.7.2

Otro mandato interesante para analizar el tiempo invertido en un mandato es

time mandato Muestra el tiempo invertido al procesar un mandato.

Específicamente muestra:

real: El tiempo durante el cual el mandato ha estado en estado de ejecución.
user: El tiempo que transcurre desde que se acciona el mandato hasta que el shell devuelve el control al usuario.
sys: El tiempo invertido por el sistema en procesar las llamadas a recursos del núcleo del sistema.

Uno de los mandatos menos utilizados suele ser nice, que sirve para que nuestros procesos en trasfondo dejen sitio, cuando sea necesario, a otros procesos que consumen más recursos. Éstos últimos usualmente son procesos interactivos y con fuerte componente de entrada/salida.

nice mandato Disminuye la demanda de prioridad para el mandato indicado.

Por ejemplo, podemos mandar un proceso costoso en tiempo de ejecución, para que se ejecute en background y que se descuelgue de la sesión si ésta finaliza en algún momento.

nohup nice proceso-costoso &

Finalmente hay que hacer hueco a uno de los mandatos más utilizados en el entorno de un estudiante de UNIX: kill. Este mandato sirve para enviar «señales» a un proceso. Estas señales disparan en dicho proceso rutinas de tratamiento de señales, y son programables por el desarrollador de aplicaciones. Algunas de ellas tienen un cometido muy concreto, y entre éstas las más utilizadas son:

SIGHUP (1) Hangup - por defecto provoca: exit. (ver termio).
SIGINT (2) Interrupt - por defecto provoca: exit. (ver termio).
SIGQUIT (3) Quit - por defecto provoca: core. (ver termio).
SIGABRT (6) Abort - por defecto provoca: core.
SIGKILL (9) Killed - por defecto provoca: exit.
SIGTERM (15) Terminated - por defecto provoca: exit.
SIGSTOP (23) Stopped - por defecto provoca: stop.

Aproximadamente desde la señal 1 a la 15 son estándar. Apartír de ahí, dependen del sistema. Para ver una lista completa recomiendo utilizar la página de manual signal, tanto en el manual 2, como en el manual 3HEAD para Solaris o 7 para Linux.

kill -l Muestra una lista de señales disponibles.
kill #-PID Envía una señal de terminación SIGTERM al proceso identificado con el PID #-PID.
kill -sig #-PID Envía una señal de número sig al proceso identificado con el PID #-PID.
kill -sig %# Igual que el anterior, pero cuando identificamos el proceso mediante el mandato jobs.

En algunas versiones de UNIX, el número de señal se precede con la opción -s.

Un uso habitual de kill es acabar con procesos colgados que aparecen cuando por alguna razón se interrumpen anormalmente sus canales de entrada/salida y no podemos hacerlos terminar de forma natural. Por ejemplo, si se pierde la conexión de una sesión, a menudo el proceso shell sigue ejecutándose aunque no podamos interactuar con él. Cuando volvemos a entrar en el sistema, al ejecutar

ps -fu pedro Si somos el usuario pedro, miramos los procesos que nos corresponden.

podríamos ver una lista como la siguiente:

     UID   PID  PPID  C    STIME TTY      TIME CMD
   pedro 18547 18545  0 11:29:12 pts/22   0:00 -bash
   pedro 18571 18547  0 11:29:12 pts/22   0:00 vi texto.txt
   pedro 18600 18593  0 11:29:12 pts/22   0:00 -bash

donde el proceso 18600 corresponde con nuestra sesión actual7.3, y sabemos de buena tinta que el resto de los procesos se corresponde con una sesión anterior. Matémoslos:

kill 18547 Terminamos (SIGTERM) con el proceso padre de los que están colgados.

Normalmente con ésto conseguimos que este proceso acabe con el resto de sus hijos al enviarles una señal de terminación, pero a veces no es suficiente, e incluso hay procesos un poco rebeldes. Para ellos reservamos la señal más mortífera:

kill -s 9 18571 Enviamos una señal KILL al proceso 18571.

El problema es que con esta señal a veces no conseguirmos liberar los recursos empleados por el proceso (buffers de entrada/salida, archivos de bloqueo,...) con lo que debemos realizar una limpieza posterior.


siguiente arriba anterior
Siguiente: Transferencia de archivos entre Arriba: Procesos y control de Anterior: Remitir trabajos
Cesar Llamas Bello 2001-01-09