Procesos Unix en primero y segundo plano

En unix existen un compilacion de diferentes shells lo cual muestra lo que es la gran diversidad que hay en unix y la cada uno con su versatilidad, no todas las cosas funcionan igual en cada uno de los shells pero mayormente estare enfocado en usar los siguientes shells que creo tambien que son los mas usados y conocidos:

-Bash

-sh

-csh

-ksh

para cada uno de estos shell en los sistemas operativos con kernel linux usan un emulador para el manejo de la shell, en escritorios como gnome vamos a encotrar -el termina y en escritorios encontraremos un emulador llamado Konsola. ahora si bien es cierto por muchas razones los administradores de sistemas prefieren el manejor de procesos mediantes estas interfaces y mi idea es tratar los porcesos en primero y 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.

pasar un proceso a segundo plano con &

jjedi@r2d2:~$ xemacs &

jjedi@r2d2:~$  <—— esta listo para seguir recibiendo intruciones

si ejecutamos el comando jobs este nos volcara una lista de los procesos y su estado

jjedi@r2d2:~$ jobs
[1]-  Detenido                festival  (dir ahora: /usr/share/phpmyadmin)
[2]   Ejecutando              gedit &
[3]   Ejecutando              xchat &
[4]+  Detenido                xemacs $
jjedi@r2d2:~$

para dar un ejemplo usarmos el programa yes este imprime por defecto elcaracter “y” pero podemos pasarle por parametro una cadena y este la imprime en un, vamos a llamarlo “buble infinito” | segun el man de yes es: í – una cadena de salida varias veces hasta que mató. veamos de que se trata

jjedi@r2d2:~$yes flooding or DoS <—- yes imprimira en el stdout la dadena “flooding or DoS ” repedidasveces

flooding or DoS
flooding or DoS
flooding or DoS
flooding or DoS
flooding or DoS
flooding or DoS^C  <—Presionamos Ctrl+c para INTERRUMPIR el proceso
jjedi@r2d2:~$

Ahora para que no se muestre por pantalla redireccionaremos el stdout de yes al fichero /dev/null, este fichero esta presente en todas las versiones de unix y por lo tanto en todas las distribuciones de gnu/linux y la informacion que escribamos en ese fichero no se almacena en ningun momento en ningun sitio

jjedi@r2d2:~$ yes flooding or DoS > /dev/null
^C
jjedi@r2d2:~$

Es bueno saber que asi como Ctrl+C interrumpe un proceso la shell tambien nos permite detener temporalmente un proceso con Ctrl+Z para que cuando lo reanudemos siga trabajando normalmente

jjedi@r2d2:~$ yes > /dev/null
^Z
[5]+  Detenido                yes > /dev/null
jjedi@r2d2:~$

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.

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.

jjedi@r2d2:~$ jobs  #muestra 3 procesos en segundo plano
[1]   Detenido                festival  (dir ahora: /usr/share/phpmyadmin)
[4]-  Detenido                xemacs $
[5]+  Detenido                yes > /dev/null
jjedi@r2d2:~$ %4  #recuperamos un proceso Detenido al primer plano
xemacs $
jjedi@r2d2:~$ jobs   #imprimimos nuevamente y nos quedan 2 procesos en bg
[1]-  Detenido                festival  (dir ahora: /usr/share/phpmyadmin)
[5]+  Detenido                yes > /dev/null
jjedi@r2d2:~$

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 %.

Tenemos a la mano muchas herramientas en el shell que nos permiten trabajar con los procesos, saber sus PID, sus estamos, sus nombre, sus usuarios, la cantidad recursos que consumen. podemos mencionar algunas.

ps

pstree

top

htop (este es mas avanzado q top, y de facil uso)

kill

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:

  

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:

jjedi@r2d2:~$ yes > /dev/null &
[6] 24620
jjedi@r2d2:~$

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:

jjedi@r2d2:~$ yes > /dev/null &
[6] 24620
jjedi@r2d2:~$ kill -9 24620
jjedi@r2d2:~$ yes cadenaHCHZ > /dev/null &
[7] 24628
[6]   Terminado (killed)      yes > /dev/null
jjedi@r2d2:~$ kill 24620
bash: kill: (24620) - No existe el proceso
jjedi@r2d2:~$ kill 24628
jjedi@r2d2:~$ ^C
[7]   Terminado               yes cadenaHCHZ > /dev/nul

Para terminar es importante decir que 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.
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. unix$ kill 2315[2]+  Terminated              yes >dev/null
unix$
About these ads

Acerca de jjedixdefault

geek by default
Esta entrada fue publicada en Bash, Debian, PlanetaLinux. Guarda el enlace permanente.

4 respuestas a Procesos Unix en primero y segundo plano

  1. orvtech dijo:

    Muy bueno, queria agregar tambien el comando `nohup` que permite enviar a un proceso al fondo y mantenerlo corriendo aun y cuando abandonemos la consola. Por ejemplo:

    nohup ping 127.0.0.1 &

    Este comando enviara el comando ping con todos sus parámetros al back ground gracias al ‘&’ y el output sera automaticamente redirigido a nohup.out del directorio donde estemos, es decir de la salida de `pwd`.

    • Gracias por el excelente comentario y un saludo :) nohup se puede usar en cualquier shell, y es infalible a cualquier caída o salida,
      en un ambiente saturado de trabajo podríamos fácilmente hacer un respaldo haciendo uso de esta herramienta..

      $nohup tar -vf /dev/sdaX /home &

      bajara a nuestro dispositivo sdaX los archivos de nuestro /home en formato .tar y el archivo nohup.out crea una lista de los
      archivos que se están transfiriendo

  2. adolfo dijo:

    muy interesante saber todo esos procesos por los que hay q pasar nos ayuda en mucho saber usar los comandos en unix

  3. hugo dijo:

    Muy útil, gracias!

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s