Usando nohup en Linux para ejecutar comandos independientes de la cónsola

El comando nohup te permite ejecutar comandos el background y cerrar la consola, sin tener que esperar que se termine la ejecución de dicho comando.

Cuando ejecutamos un comando en la consola de Linux, la ejecución de dicho comando está atada a la vida del proceso de la consola mediante un enlace denominado hup, algo totalmente lógico pues como proceso, el terminal está lanzando otro proceso por lo que la vida de ambos está enlazada.

El problema (por llamarlo de alguna manera) viene cuando ejecutamos comandos que toman un tiempo considerable (como un backup) y no queremos (o no podemos) mantener la consola abierta. Me sucede cuando quiero ejecutar un respaldo en mi servidor VPS usando SSH e inmediatamente desconectarme para hacer otra cosa o simplemente descansar.

La solución viene con el comando nohup, que le dice al gestor de procesos de Linux que queremos que ambos procesos (la consola y el comando que vamos a ejecutar) tengan una vida útil por separado, por lo que podremos ejecutar el comando y desconectarnos (cerrar la consola) y el comando se seguirá ejecutando en el servidor. Lo suelo usar con frecuencia también cuando voy a dejar algo descargando en mi Raspberry Pi 3.

La sintaxis de nohup es sencilla

Sin embargo, podemos potenciar el comando mediante ciertos añadidos simples que veremos a continuación:

  • Si agregamos un ámpersand (&) al final del comando, le decimos que queremos que el comando se ejecute en background. Esto significa que correrá en segundo plano, con menor prioridad que un proceso en primer plano pero que aprovechará los recursos (CPU, RAM y Disco) que el sistema operativo le asigne cuando baje el consumo de recursos de los procesos en foreground (primer plano).

Podemos redireccionar la salida del comando a un archivo de la siguiente forma:

Así, cuando volvamos a conectarnos, veremos la salida de la ejecución del comando grabada en el archivo salida.txt, porque obviamente no veremos la salida en tiempo real, que es la razón por la que estamos usando nohup en primera instancia.

Y si el comando da error? Podemos redireccionarlo a otro archivo para consultarlo posteriormente

También podemos redireccionar los errores directamente a /dev/null si no nos interesa ver los errores que hubo ejecutando el comando, quedando todo así

No sabes qué es /dev/null? Wikipedia lo explica mejor que yo:

En sistemas operativos tipo Unix, */dev/null* o null device (‘periférico nulo’) es un archivo especial que descarta toda la información que se escribe o redirige en él. A su vez, no proporciona ningún dato a cualquier proceso que intente leer de él, devolviendo simplemente un EOF o fin de fichero.

Por último, podemos subir o bajar la prioridad del comando a ejecutar combinando nohup y el comando nice. Todo quedaría así

Donde 19 es la prioridad más baja que puedes asignarle al proceso. Estas prioridades van desde -20 (la prioridad más alta) a 19 (la prioridad más baja).

Referencia:
nohup
/dev/null
nice