jueves, 2 de junio de 2011

Procesos en background, jobs y nohup

La mayoría de los comandos se ejecutan rapidamente como lo es ls o cd , pero hay algunos que tardan bastante tiempo, por ejemplo el estar copiando archivos a otro directorio, por lo cual es necesario esperar y esperar y esperar.

En el escenario descrito, la mayoría de los usuarios optarían por terminar el proceso con ctrl + c ,pero se puede suspender utilizando ctrl + z y mandarlo a un segundo plano (background), para hacer otras tareas.

Quizas suene algo confuso pero es bastante sencillo,veamos algunos ejemplos:

--Mandar un proceso a background

--Precionamos ctrl + z, para suspenderlo
oscar@ubuntu:/proc$ teamviewer
^Z
[1]+ Detenido teamviewer

--Listamos los jobs, y veremos que esta el que acabamos de suspender
oscar@ubuntu:/proc$ jobs
[1]+ Detenido teamviewer

--Lo mandamos a backgroung para ejecutarlo
oscar@ubuntu:/proc$ bg %1
[1]+ teamviewer &

--Listando los jobs, vemos que ya no esta suspendido y que esta trabajando
oscar@ubuntu:/proc$ jobs
[1]+ Ejecutando teamviewer &

--Asi podriamos tener muchos procesos trabajando en background :
oscar@ubuntu:/proc$ jobs
[1] Ejecutando teamviewer &
[2]- Detenido gedit
[3]+ Detenido top

oscar@ubuntu:/proc$ bg %2
[2]- gedit &

oscar@ubuntu:/proc$ jobs
[1] Ejecutando teamviewer &
[2]- Ejecutando gedit &
[3]+ Detenido top

--Si deseamos MATAR un job en ejecución
oscar@ubuntu:/proc$ kill %1

oscar@ubuntu:/proc$ jobs
[1] Terminado teamviewer
[2]- Ejecutando gedit &
[3]+ Detenido top



Ahora, si analizamos vemos que se necesitan 3 pasos para poner un proceso en background, pero podemos
hacerlo solo con 1 poniendo ampersand al final de un comando, para mandarlo directamente a background:

--Mandar proceso directamente a background
proc$ gedit &
[4] 2565

--Vemos que al listarlo, ya aparece como un job
oscar@ubuntu:/proc$ jobs
[1] Ejecutando teamviewer &
[2] Ejecutando gedit &
[3]+ Detenido top
[4]- Hecho gedit

--Para regresar un proceso de backgrond a la terminal usamos "fg" con el numero del job
oscar@ubuntu:/proc$ fg %2

Nota: si cerramos la terminal o sesion , todos los jobs se finalizaran.

Para evitar esto, se utiliza el comando "nohup" de esta manera se manda el proceso a background
y queda inmune a los hangups (de ahí su nombre nohup) que es cuando se cuelga
o termina la terminal o consola de la cual se ejecutó el proceso.

oscar@ubuntu:/proc$ nohup firefox