When should I use nohup?

Comando nohup: Procesos que no se detienen

20/02/2020

Valoración: 4.8 (1940 votos)

En el mundo de la administración de sistemas y el desarrollo de software, es una situación demasiado común: inicias un proceso que tomará horas, como una copia de seguridad masiva, la compilación de un gran proyecto o un script de procesamiento de datos, solo para que tu conexión SSH se caiga o cierres accidentalmente la ventana de la terminal. El resultado es frustrante: el proceso se interrumpe y todo el trabajo se pierde. Afortunadamente, los sistemas operativos tipo UNIX, como Linux, nos proporcionan una herramienta elegante y sencilla para solucionar este problema: el comando nohup.

How do I install nohup on Linux?
In most Linux distributions, the 'nohup' command comes pre-installed, you can verify this with the command, nohup --version . If it is not installed however, you can add it via the coreutils package, sudo yum install coreutils or sudo apt-get install coreutils . To use it, simply prefix your command with nohup .

El nombre `nohup` es una abreviatura de "no hang up" (no colgar). Su función principal es permitir que un comando o script continúe ejecutándose incluso después de que el usuario que lo inició haya cerrado la sesión. Es una utilidad fundamental en el arsenal de cualquier persona que trabaje con líneas de comando, garantizando la persistencia y la fiabilidad de las tareas de larga duración.

Índice de Contenido

¿Qué es exactamente el comando `nohup` y cómo funciona?

Para entender la magia detrás de `nohup`, primero debemos hablar de una señal específica en los sistemas UNIX: SIGHUP. Esta señal, cuyo nombre completo es "Signal Hang Up", es un vestigio de los días de los módems y las terminales telefónicas. Cuando una conexión se "colgaba" (se terminaba), el sistema enviaba la señal SIGHUP a los procesos asociados con esa terminal para que también terminaran.

En el contexto moderno, cuando cierras una ventana de terminal o finaliza una sesión SSH, el shell envía la señal SIGHUP a todos los procesos que se iniciaron desde él. Esta es la forma que tiene el sistema de limpiar y evitar procesos huérfanos. La mayoría de los programas, al recibir esta señal, se detienen de inmediato.

Aquí es donde entra `nohup`. Cuando ejecutas un comando precedido por `nohup`, le estás diciendo al sistema: "Quiero que este proceso ignore por completo la señal SIGHUP". De esta manera, cuando la terminal se cierra y envía la señal de terminación, el proceso protegido por `nohup` simplemente la ignora y sigue funcionando como si nada hubiera pasado. Es, en esencia, un escudo que hace a tu proceso inmune a los cierres de sesión.

Sintaxis y Uso Básico

La belleza de `nohup` reside en su simplicidad. Su sintaxis básica es increíblemente fácil de recordar:

nohup [COMANDO] [ARGUMENTOS]

Sin embargo, usarlo de esta forma tiene una limitación: aunque el proceso no se detendrá al cerrar la sesión, seguirá ejecutándose en primer plano, ocupando tu terminal. Para que sea verdaderamente útil, casi siempre se combina con el operador ampersand (`&`), que envía el proceso a ejecutarse en segundo plano.

What is the use of nohup?
nohup is a POSIX command which means "no hang up". Its purpose is to execute a command such that it ignores the HUP (hangup) signal and therefore does not stop when the user logs out.

La sintaxis práctica y más común es:

nohup [COMANDO] [ARGUMENTOS] &

  • nohup: El comando que protege al proceso de la señal SIGHUP.
  • [COMANDO]: El programa o script que deseas ejecutar (por ejemplo, `python`, `./mi_script.sh`, `rsync`).
  • [ARGUMENTOS]: Los argumentos o flags que necesita tu comando.
  • &: El operador que le dice al shell que ejecute este comando en segundo plano, liberando inmediatamente la terminal para que puedas seguir trabajando.

Al ejecutar un comando de esta manera, la terminal te responderá con algo como `[1] 12345`. El primer número (`[1]`) es el ID del trabajo en el shell actual, y el segundo (`12345`) es el ID del Proceso (PID), un número único que identifica a tu proceso en el sistema operativo. Este PID es crucial para gestionar el proceso más adelante.

Gestionando la Salida: El Archivo `nohup.out`

Un proceso que se ejecuta en segundo plano está desvinculado de tu terminal, lo que plantea una pregunta importante: ¿a dónde va toda su salida? ¿Qué pasa con los mensajes de progreso, los resultados o los errores que normalmente se imprimirían en la pantalla?

`nohup` maneja esto de forma automática e inteligente. Por defecto, si no se especifica lo contrario, toda la salida estándar (stdout) del comando se redirige a un archivo llamado nohup.out, que se crea en el directorio desde el cual se ejecutó el comando. Si `nohup` no puede escribir en el directorio actual (por ejemplo, debido a falta de permisos), intentará crear el archivo en tu directorio de inicio (`$HOME/nohup.out`).

Este archivo es tu ventana para ver lo que está haciendo el proceso. Puedes inspeccionar su contenido con comandos como:

  • cat nohup.out: Muestra todo el contenido del archivo.
  • less nohup.out: Permite ver el archivo de forma paginada, ideal para salidas muy largas.
  • tail nohup.out: Muestra las últimas 10 líneas del archivo.
  • tail -f nohup.out: La opción más útil para monitoreo en tiempo real. Muestra las últimas líneas y sigue actualizándose a medida que el proceso escribe nueva información en el archivo.

Redirección Avanzada de Entrada y Salida

Si bien `nohup.out` es conveniente, a menudo querrás tener un control más granular sobre la salida. Es posible que desees nombrar tus archivos de registro de manera más descriptiva o separar la salida estándar de los errores. Esto se logra mediante los operadores de redirección estándar de Linux.

Recordemos los tres flujos estándar:

  • stdin (0): Entrada estándar (lo que el proceso lee).
  • stdout (1): Salida estándar (salida normal del programa).
  • stderr (2): Salida de error estándar (mensajes de error).

Aquí tienes algunas recetas comunes:

1. Redirigir la salida a un archivo personalizado:

nohup ./mi_script.sh > mi_salida.log &

Esto enviará la salida estándar a `mi_salida.log` en lugar de `nohup.out`. Los errores (stderr) todavía podrían aparecer en la terminal si no se redirigen.

2. Redirigir la salida y los errores al mismo archivo (la forma más común):

nohup ./mi_script.sh > mi_log_completo.log 2>&1 &

Este es el patrón más robusto. `> mi_log_completo.log` redirige stdout. `2>&1` le dice al sistema "redirige el flujo de error (2) al mismo lugar que el flujo de salida (1)". Esto asegura que tanto la salida normal como los errores se capturen en un único archivo de registro.

How do you run a process using nohup?
Using the nohup command is straightforward: simply enter it in your system's terminal, followed by the process you want to run continuously. Beyond basic usage, you can use it to run tasks in the background and redirect output to a specific file.

3. Separar salida y errores en archivos diferentes:

nohup ./mi_script.sh > mi_salida.log 2> mis_errores.log &

4. Evitar que la terminal se quede "colgada":

Algunos programas pueden intentar leer de la entrada estándar (stdin). Si esto sucede en un proceso en segundo plano, puede hacer que la sesión SSH se congele al intentar cerrarla. La solución es redirigir explícitamente la entrada desde `/dev/null`, un dispositivo especial que no proporciona datos:

nohup ./mi_script.sh > mi_log.log 2>&1 < /dev/null &

Monitoreo y Gestión de Procesos `nohup`

Una vez que has lanzado tu proceso, necesitas saber cómo verificar su estado y, si es necesario, detenerlo.

Cómo encontrar tu proceso:

Si perdiste el PID que se mostró al inicio, puedes encontrarlo de varias maneras:

  • Usando `ps`: El comando `ps` (process status) combinado con `grep` es un método clásico.
  • ps aux | grep 'mi_script.sh'

    Esto listará todos los procesos que contengan `mi_script.sh` en su nombre o argumentos. Busca la línea que corresponde a tu proceso y anota el PID (generalmente la segunda columna).

  • Usando `pgrep`: Un método más directo y limpio.
  • pgrep -f 'mi_script.sh'

    Este comando está diseñado específicamente para buscar procesos y devuelve directamente el PID correspondiente.

Cómo detener tu proceso:

Una vez que tienes el PID, puedes usar el comando kill para enviarle señales y detenerlo.

  • Terminación graceful (SIGTERM): Este es el método preferido. Le pide amablemente al proceso que termine, dándole la oportunidad de limpiar y cerrar archivos correctamente.
  • kill [PID]

  • Terminación forzada (SIGKILL): Si el proceso no responde a un `kill` normal, puedes forzar su detención. Esta es una medida drástica que detiene el proceso de inmediato, sin darle oportunidad de limpiar. Úsalo solo como último recurso.
  • kill -9 [PID]

Tabla Comparativa: `nohup` vs. Alternativas

`nohup` es excelente para tareas simples de "lanzar y olvidar", pero para flujos de trabajo más complejos, existen herramientas más potentes. Aquí tienes una comparación:

CaracterísticanohupScreenTmuxsystemd-run
InteractividadNula. No se puede volver a conectar al proceso.Alta. Permite desconectar y volver a conectar a la sesión.Muy Alta. Similar a Screen, con más funciones como paneles.Baja. Se gestiona como un servicio.
PersistenciaAlta. Sobrevive al cierre de sesión.Alta. La sesión persiste hasta que se cierra explícitamente.Alta. El servidor de tmux mantiene las sesiones activas.Muy Alta. Persiste incluso tras reinicios si se configura.
Gestión de Múltiples SesionesNo aplicable. Gestiona procesos individuales.Sí, se pueden tener múltiples sesiones de Screen.Sí, es una de sus fortalezas, con ventanas y paneles.Sí, cada ejecución es una unidad de servicio transitoria.
ComplejidadMuy baja. Fácil de usar.Baja-Media. Requiere aprender algunos comandos.Media. Curva de aprendizaje más pronunciada.Alta. Requiere conocimientos de systemd.
Caso de Uso IdealScripts no interactivos de "lanzar y olvidar".Mantener una sesión de shell interactiva persistente.Desarrollo remoto complejo con múltiples terminales.Ejecutar tareas como si fueran servicios del sistema.

Preguntas Frecuentes (FAQ)

¿Cuál es la diferencia entre `comando &` y `nohup comando &`?

Usar solo `comando &` pone el proceso en segundo plano, pero sigue estando vinculado a la sesión de tu terminal. Cuando cierres la sesión, el shell enviará la señal SIGHUP y el proceso se detendrá. En cambio, `nohup comando &` lo pone en segundo plano Y lo protege de la señal SIGHUP, asegurando que continúe ejecutándose después de que te desconectes.

What is the use of nohup?
nohup is a POSIX command which means "no hang up". Its purpose is to execute a command such that it ignores the HUP (hangup) signal and therefore does not stop when the user logs out.

¿Puedo traer un proceso `nohup` de vuelta al primer plano (foreground)?

No directamente. `nohup` desvincula el proceso del sistema de gestión de trabajos del shell. No puedes usar comandos como `fg` para traerlo de vuelta. Si necesitas esta funcionalidad (desconectar y volver a conectar a un proceso interactivo), herramientas como `screen` o `tmux` son la elección correcta.

¿Qué pasa si olvido redirigir la salida? ¿Se pierde?

No, afortunadamente no se pierde. Como se mencionó, `nohup` la capturará por defecto en un archivo llamado `nohup.out`, ya sea en el directorio de trabajo actual o en tu directorio de inicio (`$HOME`). Siempre tendrás un registro de lo que sucedió.

¿`nohup` funciona en todos los sistemas Linux/UNIX?

Sí. `nohup` es un comando estándar definido por POSIX, el conjunto de estándares para la compatibilidad entre sistemas operativos tipo UNIX. Esto significa que lo encontrarás disponible y funcionando de la misma manera en prácticamente todas las distribuciones de Linux (Ubuntu, CentOS, Debian), macOS y otros sistemas UNIX.

Conclusión

El comando `nohup` es una herramienta simple pero increíblemente poderosa y esencial. Ofrece una solución directa y fiable al problema universal de mantener los procesos en ejecución de forma persistente. Aunque para escenarios más complejos existen alternativas como `tmux` o `systemd`, para la gran mayoría de las tareas no interactivas de larga duración —desde backups y transferencias de archivos hasta compilaciones y scripts de análisis—, `nohup` sigue siendo la opción más rápida, sencilla y universal. Dominar su uso es un paso fundamental para cualquier persona que aspire a trabajar de manera eficiente y segura en la línea de comandos.

Si quieres conocer otros artículos parecidos a Comando nohup: Procesos que no se detienen puedes visitar la categoría Automovilismo.

Subir