El intérprete de comandos o la Terminal como se le conoce coloquialmente, puede ejecutar un proceso en primer plano o en segundo plano.
La ejecución en primer plano es la ejecución normal, es decir, que el intérprete no admite otro comando hasta que se haya terminado de ejecutar el proceso en curso. En una sola terminal sólo se permite la ejecución de un único proceso en primer plano. Además recordemos que un proceso que se ejecuta en primer plano se puede interrumpir pulsando Ctrl-C (la tecla Control y mientras está pulsada, se pulsa la letra c).
La ejecución en segundo plano consiste en comenzar un comando y, mientras se ejecuta, permitir que el intérprete admita más comandos del usuario. El intérprete permite ejecutar más de un proceso en segundo plano.
Para que el intérprete arranque un comando en segundo plano, se debe de incluir como último carácter de la línea de comandos el símbolo &. Así por ejemplo, para arrancar el editor xemacs en segundo plano se debe escribir “xemacs &“. Al ejecutar este comando se arranca el editor, pero simultáneamente el intérprete está listo para recibir más comandos.
En un determinado instante, el intérprete puede tener un conjunto de tareas ejecutándose en segundo plano. El comando jobs muestra la lista de estos procesos así como su estado de ejecución.
Para ilustrar el concepto de ejecución en primer y segundo plano se presentan los ejemplos que utilizan el comando yes. Este comando simplemente imprime la letra “y” constantemente por pantalla y no termina nunca. Si ejecutamos el comando yes en un terminal veremos como comienza a imprimir en pantalla la letra y. Para pararlo se puede pulsar Ctrl-C (la tecla control y mientras está pulsada, pulsamos la letra c) y el proceso se interrumpe:
unix$yes y y y ...... y <-- Presionamos Ctrl-C unix$
Para que la salida del comando yes no aparezca por pantalla se puede redigir al fichero /dev/null. Este fichero está presente en todas las versiones de Unix, y es un fichero que admite cualquier tipo de operación pero que no crea ningún cambio en ningún sitio. Es decir, si escribimos información en ese fichero, no hay ningún problema, pero esa información no se almacena en ningún sitio. Este fichero se suele utilizar cuando nos queremos deshacer de algún dato.
En nuestro caso, vamos a utilizar /dev/null para redireccionar la salida del comando yes, de esta forma no muestra la secuencia de letras y por pantalla, pero sí está ejecutando el proceso.
unix$yes > /dev/null <- Presionamos Ctrl-C unix$
Además de la opción de cancelar la ejecución de un proceso mediante Ctrl-C, el
shell nos permite suspender la ejecución de un proceso temporalmente de modo que cuando lo reanudemos continúe su ejecución normalmente donde se detuvo. La secuencia de teclas a pulsar para suspender la ejecución es Ctrl-Z:
unix$yes > /dev/null <-- presionamos Ctrl-Z [1]+ Stopped yes > /dev/null unix$
El número entre corchetes corresponde con el identificador de tarea (dentro de esa shell; distinto del PID, que es global para todo el sistema operativo) en segundo plano, en este ejemplo el número uno. Con este número que aparece en pantalla podemos manipular este proceso.
Tras pulsar Crtl-Z, tenemos por tanto un proceso cuya ejecución se ha suspendido, y por tanto el intérprete nos devuelve el prompt. Con el comando jobs se puede ver la lista de procesos en segundo plano y su estado actual, por ejemplo (esta es una sesión ficticia):
unix$jobs [1]- Running xemacs & (wd: ~) [2]+ Stopped yes > /dev/null unix$
En este ejemplo vemos que aparte del proceso con el comando yes (con el identificador de tarea 2 y cuyo estado es Stopped) existe otro proceso con identificador de tarea 1 y cuyo estado es Running.
En este punto podemos instruir al shell para que active de nuevo la ejecución del proceso yes, pero indicarle que se ejecute en segundo plano, y de este modo quede libre para poder recibir nuevas ordenes. El comando bg seguido del número de proceso con prefijo % realiza esta misma función.
unix$bg %2 [2]+ yes >dev/null & unix$
Si ejecutamos de nuevo el comando jobs nos muestra ahora la nueva situación, es decir, con el comando yes en estado Running:
unix$ jobs [1]- Running xemacs & (wd: ~) [2]+ Running yes >dev/null & unix$
El comando bg que es la abreviatura de la palabra background por tanto recibe como parámetro un número de proceso en estado Stopped y hace que ésta reanude su ejecución pero en segundo plano es decir, sin bloquear el teclado para el shell.
De igual forma que hemos pasado un proceso a ejecutar a un segundo plano, el shell nos permite recuperar la ejecución en primer plano de un proceso que estaba en segundo plano. Para ello se utiliza el comando fg (abreviatura de la palabra foreground). Como parámetro recibe al igual que bg el número de un proceso prefijado con %.
Para interrumpir un proceso que se está ejecutando en segundo plano podemos hacerlo de dos formas. Mediante el comando fg la pasamos a ejecutar al primer plano y luego con Ctrl-C. Pero también podemos conseguir el mismo efecto sin utilizar el comando fg sino simplemente con el comando kill seguido del número de proceso prefijado con el símbolo %. Por ejemplo:
unix$ kill %2 [2]+ Terminated yes >dev/null unix$
El shell también nos permite arrancar la ejecución de un proceso directamente en segundo plano en lugar de arrancarla en primer plano, parar su ejecución con Crtl-Z y luego pasarla a segundo plano mediante el comando bg. Esta ejecución directa en segundo plano se denota añadiendo al final de la línea de comando el símbolo &. Por ejemplo:
unix$ yes > /dev/null & [2] 2315 unix$
Nótese el símbolo & al final de la línea. Justo a continuación, el shell imprime una línea que contiene entre corchetes el número de proceso en segundo plano asignado (en este caso el 2), y a continuación el PID de dicho proceso (en este caso el 2315).
Por último, también podemos interrumpir la ejecución de un proceso no sólo mediante el número que proporciona el comando jobs sino también utilizando su PID. Siguiendo con el ejemplo anterior, como el shell nos informa que el PID asignado al proceso es 2315, podemos utilizar directamente el comando kill seguido del PID (sin el símbolo %) para terminar la ejecución:
unix$ kill 2315 [2]+ Terminated yes >dev/null unix$
Importante: Si se arrancan procesos en segundo plano y no se cancela su ejecución, seguirán ejecutándose hasta que no se les ordene lo contrario (o el programa que ejecutan termina por sí mismo). Se debe en todo momento comprobar que no quedan procesos residuales que se han olvidado de cancelar. Un número elevado de estos procesos eventualmente podría llegar a bloquear el sistema.
Agrega un comentario