next up previous
Next: Usando del background Up: Los procesos en UNIX Previous: Generación de los procesos

El control de procesos en UNIX

Como sabemos, UNIX es un sistema operativo multitarea, por lo que en todo momento es normal que encontremos más de un proceso ejecutándose y por lo tanto residente en memoria principal. Es esta sección estudiaremos los comandos que permiten gestionan los procesos concurrentes:
1.
El estado de los procesos.
El comando que averigua cuales son los procesos que se están ejecutando en un instante determinado ya es conocido: ps (Process Status):
(a)
ps -arux
El comando ps genera una lista con información sobre el estado de los procesos. Por defecto (sin opciones) la lista se limita a los procesos creados en el shell actual. La opción -a presenta los procesos de todos los usuarios. La opción -x lista los procesos en background que están corriendo pero que fueron creados en sesiones anteriores. La opción -r restringe la salida a los procesos que están corriendo. La opción -u informa extensamente acerca de todos los procesos que hemos seleccionado con el resto de las opciones. La información presentada es la siguiente:


\begin{displaymath}\vline
\begin{tabular}{r\vert l}
\hline
{\bf Columna} & {\bf ...
...mando que ha creado el proceso. \\
\hline
\end{tabular}\vline
\end{displaymath}

Dónde el campo STAT toma los siguientes valores en función de si el proceso está:


\begin{displaymath}\vline
\begin{tabular}{r\vert l}
\hline
{\bf Caracter} & {\bf...
... 20 segs. \\
{\tt Z} & Zombie. \\
\hline
\end{tabular}\vline
\end{displaymath}

En el caso de que STAT tenga una de las letras anteriores seguida de la letra N significa que la prioridad actual del proceso ha sido modificada con el comando nice . Si sigue una W, significa que el proceso está "swapped out". Esto quiere decir que el proceso se está ejecutando, pero sus páginas de código se han escrito en el disco para dejar espacio en la memoria de la computadora para que otro proceso se puede ejecutar. Valga como ejemplos:



width 3pt
width .3pt415ptgogh: > ps (preguntamos por los procesos que ejecuto concurrentemente)
  PID TTY STAT  TIME COMMAND
   58 v01 S     0:01 -csh (un C Shell)
   59 v02 S     0:00 -csh
   71 v02 S     0:01 telnet iron (una conexión a otra estación llamada íron')
   72 v01 S     1:12 vi shells.tex i (el documento que estoy escribiendo)
  160 v03 S     0:01 -csh
  191 v03 R     0:00 ps (el programa que muestra los procesos)
gogh: > ps -u (deseo toda la información acerca de mis procesos)
USER       PID vi          58  0.0  5.6  346  156 v01 S    15:53   0:01 -csh
vi          59  0.0  6.6  346  184 v02 S    15:53   0:00 -csh
vi          71  0.0  1.8  112   52 v02 S    15:56   0:01 telnet iron
vi          72  0.6  7.7  168  216 v01 S    15:58   1:15 vi shells.tex
vi         160  0.0 11.9  348  332 v03 S    18:34   0:01 -csh
vi         192  0.0  8.0   72  224 v03 R    19:12   0:00 ps -u
gogh: >ps -a (información acerca de todos los procesos)
  PID TTY STAT  TIME COMMAND
   61 v04 S     0:00 -bash
   62 v05 SW    0:00 (agetty)
   63 v06 SW    0:00 (agetty)
  174 v04 S     0:00 -sh
   58 v01 S     0:01 -csh
   59 v02 S     0:00 -csh
   71 v02 S     0:01 telnet iron
   72 v01 S     1:16 vi shells.tex
  160 v03 S     0:01 -csh
  193 v03 R     0:00 ps -a
gogh:/> find . -name carta -print > $HOME/busqueda & (en background)
[1] 203 (número que identifica el proceso en background)
gogh:/> ps -r (procesos que están corriendo)
  PID TTY STAT  TIME COMMAND
  203 v03 R     0:06 find . -name carta -print
  205 v03 R     0:00 ps -r
gogh: >
[1]    Done                  find . -name carta -print
gogh: > (sleep 100; echo He dormido durante 100 segs) &
[1] 285
gogh: > ps -x (preguntamos por los procesos corriendo en background)
  PID TTY STAT  TIME COMMAND
   58 v01 SW    0:01 (csh)
   59 v02 SW    0:00 (csh)
   71 v02 S     0:03 telnet iron
   72 v01 S     1:42 vi shells.tex
  279 v03 S     0:01 -csh
  285 v03 S     0:00 -csh
  286 v03 S     0:00 sleep 100 (este proceso duerme en background 100 segs)
  287 v03 R     0:00 ps -x
gogh: >
gogh: > He dormido durante 100 segs
[1]    Done                   ( sleep 100; echo He dormido durante 100 segs )
gogh: >
width .3pt
depth .3pt width -3pt
2.
Matando procesos.
En el caso de que deseemos que un proceso finalice su ejecución antes de que acabe por su normal realización, podemos usar el comando:
$\diamond$
kill [-identificativo_de_señal] {número_de_proceso}+
kill -l
Normalmente, no se hace necesario recurrir a una señal poderosa para acabar con la ejecución de la mayoría de los procesos, pero cuando alguno se resiste, la opción -9 (muerte incondicional) hace maravillas. La opción -l provoca la obtención de una lista con todos los posibles identificativos de señales que podemos enviar a los procesos. Ejemplos:



width 3pt
width .3pt415ptgogh: > sleep 1000 & (ejecutamos en background un proceso que espera 1000 segs)
[1] 29
1 gogh: > ps -r (procesos ejecutándose)
  PID TTY STAT  TIME COMMAND
  292 v03 R     0:00 ps -r (este es el único que consume CPU)
gogh: > ps -x (procesos ejecutándose y en background)
  PID TTY STAT  TIME COMMAND
   58 v01 SW    0:01 (csh)
   59 v02 SW    0:00 (csh)
   71 v02 S     0:03 telnet iron
   72 v01 S     1:48 vi shells.tex
  279 v03 S     0:01 -csh
  291 v03 S     0:00 sleep 1000 (el proceso de espera esta dormido)
  293 v03 R     0:00 ps -x
gogh: > kill 291 (matamos el proceso de espera)
[1]    Terminated             sleep 1000
gogh: > ps -x (efectivamente el proceso ha sido eliminado)
  PID TTY STAT  TIME COMMAND
   58 v01 SW    0:01 (csh)
   59 v02 SW    0:00 (csh)
   71 v02 S     0:03 telnet iron
   72 v01 S     1:50 vi shells.tex
  279 v03 S     0:01 -csh
  294 v03 R     0:00 ps -x
gogh: >
width .3pt
depth .3pt width -3pt

Existen procesos que no se pueden matar con kill porque cambian su PID dinámicamente. El proceso de matanza es en esto casos especial y más laborioso.


next up previous
Next: Usando del background Up: Los procesos en UNIX Previous: Generación de los procesos
Vicente González Ruiz
1998-07-13