miércoles, 19 de septiembre de 2012

Entendiendo el Shell - Post extra (ñapa)

Bueno, realmente el Shell Bash tiene muchísimas opciones y características y a medida que se profundiza en ellas más interesantes se vuelven. Les traigo este post de ñapa con funciones del Shell que quizás no conocías: El Shell tiene control de trabajos: La habilidad para ejecutar comandos en segundo y en primer plano. Un trabajo es uno o varios comandos que ocupan al Shell en un momento determinado. Cuando ejecutamos un comando interactivo, el Shell actual lo trata como un trabajo. Una vez el comando es completado, el trabajo asociado desaparece. 

Los trabajos tareas están a un nivel más alto que los procesos en Linux; el sistema operativo no sabe nada acerca de ellos. Los trabajos son construidos propiamente por el Shell. 

Terminologías comunes son:
  • Trabajo en primer plano: Es un trabajo que el Shell está haciendo y ocupa el prompt del mismo, por lo que no podemos hacer otra cosa hasta que termine. 
  • Trabajo en segundo plano: Es un trabajo que corre en segundo plano, por lo que podemos usar el Shell para otro comando. 
  • Suspender: Detener un trabajo en primer plano de forma temporal. 
  • Reanudar: Hacer que un trabajo suspendido vuelva a ejecutarse. 

Los comandos internos de Bash asociados con los trabajos en segundo plano son los siguientes:
jobs		Lista los trabajos del Shell
&		Ejecuta un trabajo en segundo plano
^Z		Suspende un trabajo en segundo plano
suspend		Suspende el Shell
fg		Reanuda un trabajo, trayéndolo al primer plano
bg		Hace que un trabajo suspendido corra en segundo plano
Trabajos (jobs) 
El comando jobs lista las tareas en ejecución en el Shell actual.
fraterneo@rainbow:~$ jobs
[1]- Running 		nano archivo1.txt &
[2]+ Stopped 		su
El numero a la izquierda es el nombre de la tarea y el signo + identifica el trabajo afectado por los comandos primer plano (fg) y segundo plano (bg). 

& 
Cuando lo ubicamos al final de un comando, el ampersand causa que el comando en cuestión se ejecute como un trabajo en segundo plano.
fraterneo@rainbow:~$ nano archivo1.txt &
[2] 28095
El Shell nos indica el numero del trabajo (2) y el ID del proceso del comando (28095). 

^Z 
El teclear la combinación Ctr+Z, cuando un trabajo está en ejecución en primer plano, se suspenderá dicho trabajo. Solo se detiene su ejecución pero su estado es recordado.
fraterneo@rainbow:~$ mtr google.com.do
^Z
[1]+ Stopped mtr google.com.do
fraterneo@rainbow:~$ 
Ahora estamos listos para ejecutar el comando bg para enviar ese trabajo al segundo plano, o fg para regresarlo al primer plano o reanudarlo. 

suspend 
El comando interno suspend suspende el Shell actual siempre que sea posible, y es como si le enviáramos un ^Z a Bash mismo. Por ejemplo, su ejecutamos el comando su y queremos regresar al Shell de nuestro usuario:
fraterneo@rainbow:~$ whoami
fraterneo
fraterneo@rainbow:~$ su -
Password:
root@rainbow:~# whoami
root
root@rainbow:~# suspend
[1]+ Stopped 			su
fraterneo@rainbow:~$ whoami
fraterneo
bg 
El comando bg envía un trabajo suspendido a ejecutarse en el segundo plano. Sin argumentos, bg opera en el trabajo suspendido mas reciente. Para especificar un trabajo particular (como los muestra el comando jobs), debemos suplirle el numero del trabajo precedido por el signo %.
fraterneo@rainbow:~$ bg %2
Algunos tipos de trabajos interactivos no pueden permanecer en el segundo plano, por ejemplo, si está esperando por una entrada de datos. Si lo intentamos, el Shell suspenderá el trabajo y mostrara lo siguiente: [2]+ Stopped comando.

Ahora puedes reanudar el trabajo (con fg) y continuar. 

fg 
El comando fg trae un trabajo suspendido o en segundo plano hacia el primer plano. Sin argumentos, fg selecciona el trabajo suspendido o enviado a segundo plano más reciente. Para especificar un trabajo particular, igual que en el caso del comando bg, debemos suplirle el numero del trabajo precedido del signo %.
fraterneo@rainbow:~$ fg %3
Terminando un comando en progreso (^C) 
Si hemos ejecutado un comando en el Shell en primer plano, y queremos terminar o matar dicho comando, usaremos la combinación Ctr+C. El Shell reconoce esto como “termina el comando actual en primer plano ahora”. 

Para terminar un programa en ejecución en segundo plano, podemos traerlo al primer plano con fg y luego terminarlo con ^C o usar el comando kill PID para tal fin. Aunque ^C no siempre es la mejor forma de hacer esto, ya que muchos comandos particulares tienen su propia forma de ser terminados, y es recomendable hacerlo a su manera. 

Otro asunto es que ^C puede provocar una reacción desagradable del Shell y hacer que no responda a las entradas del teclado, debido a que el comando terminado no tiene tiempo de limpiar su salida. Si esto pasa podemos solucionarlo así: 

Con ^J (Ctrl+J) para conseguir el prompt del Shell. Esto produce el mismo resultado que presionar Enter (una nueva línea) pero funcionará aun cuando Enter no lo haga. 

Debemos tomar en cuenta que muchos comandos o programas como emacs están programados para ignorar ^C y otras combinaciones de teclas. 

Terminando un Shell  (exit)
Para terminar o cerrar un Shell lo haremos con el comando exit o con ^D (Ctrl+D). Esta combinación envía al Shell la señal EOF (End Of File), lo que hace que el mismo termine.

No hay comentarios:

Publicar un comentario