Procesos en Background

Una de las grandes ventajas de linux es la ejecución de procesos en background. Por ejemplo si sabemos que la copia de un fichero puede llevar mucho tiempo y no queremos estar esperando a que termine para seguir trabajando entonces podemos lanzarlo en background. Para ello añadimos & al comando que queramos lanzar por ejemplo:

 cp archivo1 archivo2 &

Si hemos lanzado un comando y lo queremos pasar a background presionamos CTRL+z, para parar el proceso y seguidamente escribimos bg para pasarlo a background, o volverlo a continuar en foreground con fg.

Con el comando jobs, podemos ver los procesos que están corriendo y sus posiciones

Supongamos que acabo de ejecutar el comando visudo para editar el fichero de permisos de sudo, pero en un momento dado quiero pasarlo a background pulsando CTRL+Z con lo cual vuelvo a la consola. Para volverlo a llamar me basta con poner fg y el número de proceso

Lanzar procesos con nohup

Esto es útil si queremos lanzar procesos que no se terminen al matar el shell padre. Un claro ejemplo del uso de nohup es cuando hacemos una conexión remota por ssh para lanzar un proceso y no queremos que el proceso se pare al desconectarnos.

nohup proceso &

Una buena practica sería redireccionar stdin, stdout y stderr, para:

  1. rastrear la salida de nuestro script en caso de producirse algún error
  2. evitar problemas al terminar nuestra sesión ssh

Por ejemplo:

nohup ./miscript.sh > foo.out 2> foo.err < /dev/null &

screen

Si hemos lanzado algún proceso con nohup y & y en algún momento queremos volver a ver que está pasando, no podríamos . La única forma sería haber utilizado el comando screen

El proceso sería el siguiente:

  • lanzamos el script que necesitamos como parámetro del comando screen.

screen ./miscript.sh

  • Presionamos CTRL+A d para volver a la terminal a ejecutar otros comandos o simplemente para desconectarnos mientras sigue el proceso ejecutándose
  • Cuando queramos volver a conectarnos a nuestro proceso, lo primero es saber el identificador del screen

screen -ls

root@bananapi:~# screen -ls
There are screens on:
              24274.pts-0.bananapi    (04/27/2018 11:20:49 PM)        (Detached)
2 Sockets in /run/screen/S-root.
  • Para reconectarnos al proceso usamos el parámetro -r y el identificador de la sesión.

screen -r 24274.pts-0.bananapi

Opciones de screen

ctrl + a y después dPara salir
Ctrl.+a “ para ver las sesiones
Ctrl.+a n o [espacio] se mueve hacia delante
Ctrl.+a p se mueve hacia atrás
Ctrl.+a c crea una nueva sesión
Ctrl.+a ? ayuda
Ctrl.+a a manda a un screen a lo que se está ejecutando
screen –ls lista todos los screen abiertos
screen –x si sólo hay uno abre ese. Si hay más de uno muetra una lista y entonces habría que hacer screen –x –r <sid>