 |
CONTROL DE PROCESOS 3.11 |
 |
3.11.1 Tareas y procesos
El Control de Tareas es una utilidad incluida en muchas shells (incluidas Bash y Tcsh), que permite el control de
multitud de comandos o tareas al momento. Antes de seguir, deberemos hablar un poco sobre los procesos.
Cada vez que usted ejecuta un programa, usted lanza lo que se conoce como proceso, que es simplemente el nombre que se
le da a un programa cuando se está ejecutando. El comando ps visualiza la lista de procesos que se están ejecutando
actualmente, por ejemplo:
/home/Decker# ps
PID TT STAT TIME COMMAND
24 3 S 0:03 (bash)
161 3 R 0:00 ps
/home/Decker#
|
La columna PID representa el identificador de proceso. La ultima columna COMMAND, es el nombre del proceso que se está
ejecutando. Ahora sólo estamos viendo los procesos que está ejecutando Decker. Vemos que hay dos procesos, bash
(Que es el shell o interprete de comandos que usa Decker), y el propio comando ps. Como puede observar, la bash se
ejecuta concurrentemente con el comando ps. La bash ejecutó ps cuando Decker tecleó el comando. Cuando ps termina de
ejecutarse (después de mostrar la tabla de procesos), el control retorna al proceso bash, que muestra el prompt,
indicando que esta listo para recibir otro comando.
Un proceso que esta corriendo se denomina tarea para el shell. Los términos proceso y tarea, son intercambiables. Sin
embargo, se suele denominar "tarea" a un proceso, cuando es usado en conjunción con control de tareas, que es un rasgo
del shell que permite cambiar entre distintas tareas.
En muchos casos, los usuarios solo ejecutan un trabajo cada vez, que es el último comando que ellos teclearon desde el
shell. Sin embargo, usando el control de tareas, usted podrá ejecutar diferentes tareas al mismo tiempo, cambiando
entre cada uno de ellos conforme lo necesite. ¿Cuan beneficioso puede llegar a ser esto?. Supongamos que está usted
con su procesador de textos, y de repente necesita parar y realizar otra tarea, con el control de tareas, usted podrá
suspender temporalmente el editor, y volver al shell para realizar cualquier otra tarea, y luego regresar al editor
como si no lo hubiese dejado nunca. Lo siguiente solo es un ejemplo, hay montones de usos prácticos del control de
tareas.
3.11.2 Primer plano y Segundo plano
Un proceso puede estar en Primer plano o en Segundo plano. Solo puede haber un proceso en primer plano al mismo tiempo,
el proceso que esta en primer plano, es el que interactua con usted recibe entradas de teclado, y envía las salidas al
monitor. (Salvo, por supuesto, que haya redirigido la entrada o la salida, como se describe en la Sección 3.8).
El proceso en segundo plano, no recibe ninguna señal desde el teclado por lo general, se ejecutan en silencio sin
necesidad de interacción.
Algunos programas necesitan mucho tiempo para terminar, y no hacen nada interesante mientras tanto.
Compilar programas es una de estas tareas, así como comprimir un fichero grande. No tiene sentido que se siente y se
aburra mientras estos procesos terminan. En estos casos es mejor lanzarlos en segundo plano, para dejar el ordenador
en condiciones de ejecutar otro programa.
Los procesos pueden ser suspendidos. Un proceso suspendido es aquel que no se está ejecutando actualmente, sino que
esta temporalmente parado. Después de suspender una tarea, puede indicar a la misma que continúe, en primer plano o en
segundo, según necesite. Retomar una tarea suspendida no cambia en nada el estado de la misma la tarea continuará
ejecutándose justo donde se dejo.
Tenga en cuenta que suspender un trabajo no es lo mismo que interrumpirlo. Cuando usted interrumpe un proceso
(generalmente con la pulsación de [ctrl-C], el proceso muere, y deja de estar en memoria y utilizar recursos del
ordenador. Una vez eliminado, el proceso no puede continuar ejecutándose, y deberá ser lanzado otra vez para volver a
realizar sus tareas. También se puede dar el caso de que algunos programas capturan la interrupción, de modo que
pulsando [ctrl-C] no se para inmediatamente. Esto se hace para permitir al programa realizar operaciones necesarias
de limpieza antes de terminar. De hecho, algunos programas simplemente no se dejan matar por ninguna interrupción.
3.11.3 Envío a segundo plano y eliminación de procesos
Empecemos con un ejemplo sencillo. El comando yes es un comando aparentemente inútil que envía una serie
interminable de yes a la salida estandar. (Realmente es muy útil. Si se utiliza una tubería (o "pipe") para unir la
salida de yes con otro comando que haga preguntas del tipo si/no, la serie de yes confirmará todas las preguntas.)
Pruebe con esto.
/home/Decker# yes
y
y
y
y
y
|
La serie de y-es continuará hasta el infinito, a no ser que usted la elimine, pulsando la tecla de interrupción,
generalmente [ctrl-C]. También puede deshacerse de esta serie de y-es redigiriendo la salida estandar de yes hacia
/dev/null, que como recordará es una especie de "agujero negro" o papelera para los datos. Todo lo que usted envie alli,
desaparecerá.
|
/home/Decker# yes > /dev/null
|
Ahora va mucho mejor, el terminal no se ensucia, pero el prompt de la shell no retorna. Esto es porque yes sigue
ejecutándose y enviando esos inútiles y-es a /dev/null. Para recuperarlo, pulse la tecla de interrupción.
Supongamos ahora que queremos dejar que el comando yes siga ejecutándose, y volver al mismo tiempo a la shell para
trabajar en otras cosas. Para ello nos enviaremos a yes a segundo plano, lo que nos permitirá ejecutarlo, pero sin
necesidad de interacción.
Una forma de mandar procesos a segundo plano es añadiendo un carácter "&" al final de cada comando.
/home/Decker# yes > /dev/null &
[1] 164
/home/Decker#
|
Como podrá ver, ha regresado a la shell.
¿Pero que es eso de "[1] 164"?,
¿se está ejecutando realmente el comando yes?
"[1]" representa el número de tarea del proceso yes. La shell asigna un número a cada tarea que se esté ejecutando.
Como yes es el único comando que se esta ejecutando, se le asigna el número de tarea 1. El número "164" es el número
de identificación del proceso, o PID, que es el número que el sistema le asigna al proceso. Ambos números pueden usarse
para referirse a la tarea como veremos después.
Ahora usted tiene el proceso yes corriendo en segundo plano, y enviando constantemente la señal 'y' hacia el dispositivo
/dev/null. Para chequear el estado del proceso, utilice el comando interno de la shell jobs:
/home/Decker# jobs
[1]+ Running yes >/dev/null &
/home/Decker#
|
¡Ahí esta!. También puede usar el comando ps, como mostramos antes, para comprobar el estado de la tarea. Para eliminar
una tarea, utilice el comando kill. Este comando toma como argumento un número de tarea o un número de ID de un
proceso. Esta era la tarea 1, así que usando el comando
matará la tarea. Cuando se identifica la tarea con el número de tarea, se debe preceder el número con el carácter de
porcentaje (`%").
Ahora que ya hemos matado la tarea, podemos usar el comando jobs de nuevo para comprobarlo:
/home/Decker# jobs
[1]+ Terminated yes >/dev/null
/home/Decker#
|
La tarea esta, en efecto, muerta, y si usa el comando jobs de nuevo, no mostrara nada.
También podrá matar la tarea usando el numero de ID de proceso (PID), el cual se muestra conjuntamente con el ID de
tarea cuando arranca la misma. En nuestro ejemplo el ID de proceso es 164, así que el comando
es equivalente a
No es necesario usar el "%" cuando nos referimos a una tarea a traves de su ID de proceso.
3.11.4 Parada y relanzamiento de tareas
Hay otra manera de poner una tarea en segundo plano. Usted puede lanzarlo como un proceso normal (en primer plano),
pararlo, y después relanzarlo en segundo plano.
Primero, lance el proceso yes en primer plano como lo haría normalmente:
|
/home/Decker# yes > /dev/null
|
De nuevo, dado que yes corre en primer plano, no debe retornar el prompt de la shell.
Ahora, en vez de interrumpir la tarea con [ctrl-C], suspenderemos la tarea. El suspender una tarea no la mata:
solamente la detiene temporalmente hasta que Ud. la retoma. Para hacer esto usted debe pulsar la tecla de suspender,
que suele ser [ctrl-Z]
/home/Decker# yes > /dev/null
[ctrl-Z]
[1]+ Stopped yes >/dev/null
/home/Decker#
|
Mientras el proceso esta suspendido, simplemente no se está ejecutando. No gasta tiempo de CPU en la tarea. Sin embargo,
usted puede retomar el proceso de nuevo como si nada hubiera pasado. Continuará ejecutándose donde se dejo.
Para relanzar la tarea en primer plano, use el comando fg (del ingles "foreground").
/home/Decker# fg
yes >/dev/null
|
La shell muestra el nombre del comando de nuevo, de forma que tenga conocimiento de que tarea es la que ha puesto en
primer plano. Pare la tarea de nuevo, con [ctrl-Z]. Esta vez utilice el comando bg para poner la tarea en segundo
plano. Esto hará que el comando siga ejecutándose igual que si lo hubiese hecho desde el principio con "&" como en
la sección anterior.
/home/Decker# bg
[1]+ yes >/dev/null &
/home/Decker#
|
Y tenemos de nuevo el prompt. El comando jobs debería decirnos que yes se esta ejecutando, y podemos matar la tarea con
kill tal y como lo hicimos antes.
¿Como podemos parar la tarea de nuevo? Si pulsa [ctrl-Z] no funcionará, ya que el proceso está en segundo plano. La respuesta
es poner el proceso en primer plano de nuevo, con el comando fg, y entonces pararlo. Como puede observar podrá
usar fg tanto con tareas detenidas, como con las que estén segundo plano.
Hay una gran diferencia entre una tarea que se encuentra en segundo plano, y una que se encuentra detenida. Una tarea
detenida es una tarea que no se está ejecutando, es decir, que no usa tiempo de CPU, y que no está haciendo ningún trabajo
(la tarea aún ocupa un lugar en memoria, aunque puede ser volcada a disco). Una tarea en segundo plano, se está
ejecutando, y usando memoria, a la vez que completando alguna acción mientras usted hace otro trabajo. Sin embargo,
una tarea en segundo plano puede intentar mostrar texto en su terminal, lo que puede resultar molesto si esta intentando
hacer otra cosa. Por ejemplo, si usted uso el comando
sin redirigir stdout a /dev/null, una cadena de y-es se mostrarán en su monitor, sin modo alguno de interrumpirlo
(no puede hacer uso de [ctrl-C] para interrumpir tareas en segundo plano). Para poder parar esas interminables y-es,
tendría que usar el comando fg para pasar la tarea a primer plano, y entonces usar [ctrl-C] para matarla.
Otra observación. Normalmente, los comandos "fg" y "bg" actúan sobre el último proceso parado (indicado por un "+" junto
al número de tarea cuando usa el comando jobs). Si usted tiene varios procesos corriendo a la vez, podrá mandar a
primer o segundo plano una tarea especifica indicando el ID de tarea como argumento de fg o bg, como en
(para la tarea de primer plano número 2), o
(para la tarea de segundo plano número 3). No se pueden usar los ID de proceso con fg o bg.
Además de esto, si usa el número de tarea por si solo, como
es equivalente a
Solo recordarle que el uso de control de tareas es una utilidad de la shell. Los comandos fg, bg y jobs son
internos de la shell. Si por algún motivo usted utiliza una shell que no soporta control de tareas, no espere disponer
de estos comandos.
Y además, hay algunos aspectos del control de tareas que difieren entre Bash y Tcsh. De hecho, algunas shells no
proporcionan ningún control de tareas sin embargo, la mayoría de las shells disponibles para Linux soportan control de
tareas.