Cómo evitar que un comando deje de ejecutarse al cerrar el terminal en Linux

Última actualización: 17/12/2025
Autor: Isaac
  • Usar nohup y la ejecución en segundo plano permite que los procesos sigan activos aunque cierres la terminal o la sesión SSH.
  • El control de trabajos con &, Ctrl+Z, bg, fg y el comando interno disown desvincula procesos ya lanzados de la consola.
  • Herramientas como screen o tmux crean sesiones de terminal persistentes ideales para tareas largas en servidores remotos.
  • Conocer el comportamiento de paginadores como less evita confundir salidas paginadas con terminales «bloqueadas».

Evitar que un comando deje de ejecutarse al cerrar el terminal en Linux

Si trabajas mucho con la terminal en Linux, tarde o temprano te habrás topado con la situación típica: lanzas un comando que tarda un buen rato (un rsync, un find enorme, un script pesado, una copia de archivos, una descarga con youtube-dl…) y, cuando vas a cerrar la ventana o se corta la sesión SSH, el proceso muere sin piedad. A veces incluso habías abierto una aplicación gráfica (como gedit o Firefox) desde la consola y al cerrar la terminal te la has llevado por delante.

La buena noticia es que el sistema ofrece varias formas de evitar este problema: puedes hacer que tus comandos sigan ejecutándose aunque cierres la terminal, aunque se caiga la conexión SSH e incluso aunque cierres sesión en tu usuario. Vamos a ver, con calma y en detalle, cómo funcionan herramientas como nohup, disown, el uso de &, el control de trabajos con Ctrl+Z, y alternativas más avanzadas como screen o tmux, además de trucos prácticos para el día a día.

Por qué los procesos se paran al cerrar el terminal

Para entender cómo evitar que un comando se detenga al cerrar la consola, primero conviene saber por qué ocurre. Cuando abres una terminal (bash, zsh, etc.) y ejecutas un comando, ese proceso queda asociado a tu sesión de terminal y se considera un «job» o trabajo de la shell. Mientras la terminal esté viva, la shell puede mostrar su salida y controlar su ejecución.

Cuando cierras la ventana de la terminal o se corta la sesión SSH, el sistema envía a los procesos asociados una señal llamada SIGHUP (hangup). Esta señal sirve precisamente para indicar que la sesión de control se ha cerrado. Muchos programas, al recibir SIGHUP, terminan su ejecución de inmediato, lo que explica por qué tus comandos largos o tus aplicaciones gráficas se paran.

La clave está en impedir que esa señal mate al proceso o en «desvincular» el comando de la terminal que lo lanzó, de forma que el cierre de la consola deje de afectarle. Eso es justo lo que consiguen utilidades como nohup o el comando interno disown de bash, junto con la ejecución en segundo plano.

Este comportamiento no solo afecta a comandos de texto: si lanzas, por ejemplo, gedit o firefox desde la terminal, seguirán ligados a ella. Cuando cierres la consola, se cerrará también la aplicación gráfica, salvo que la hayas separado correctamente del terminal.

Usar nohup para que un comando sobreviva al cierre de la terminal

Uso de nohup en Linux

La herramienta más directa y sencilla para estos casos es nohup. Su nombre viene de «no hang up» y su función es muy concreta: hacer que el proceso ignore la señal SIGHUP. Dicho de forma llana, si lanzas un comando con nohup, ese proceso seguirá en marcha aunque cierres la terminal, cierres la sesión gráfica o se corte la conexión SSH.

La sintaxis básica es muy simple: se coloca nohup delante del comando que quieras ejecutar y, normalmente, se añade un & al final para enviarlo al segundo plano:

nohup ./programa.sh &

¿Qué hace exactamente este comando? Por un lado, nohup indica al sistema que el proceso ignore SIGHUP. Por otro, al colocar & al final, le dices a la shell que ejecute el comando en background, devolviéndote el prompt inmediatamente para que puedas seguir usando la terminal.

Además, nohup redirige automáticamente la salida del programa a un fichero llamado nohup.out si no le dices lo contrario. Ese archivo se crea en el directorio desde el que lanzas el comando y guardará todo lo que el programa habría mostrado por pantalla. Si quieres revisar más tarde qué ha sucedido, basta con hacer algo como:

cat nohup.out

En tareas largas de administración de sistemas esto es especialmente útil: puedes dejar una búsqueda, un backup, un script de mantenimiento o una descarga pesada en marcha, cerrar tu sesión SSH tranquilamente y consultar el resultado después.

  Instalar Ghostty en Linux: Guía Completa Paso a Paso

Ejemplo práctico: búsqueda masiva con nohup

Ejemplo de comando con nohup

Supón que quieres localizar todos los archivos de tu /home que ocupen más de 100 MB. Eso puede llevar su tiempo, y probablemente no quieras tener la terminal secuestrada hasta que termine. Puedes lanzar el comando con nohup y redirigir su salida a un fichero de resultados:

nohup find /home -type f -size +100M > ~/resultados &

En este comando intervienen varias piezas importantes:

  • nohup: hace que el proceso ignore el colgado de la sesión.
  • find /home -type f -size +100M: busca ficheros normales en /home con tamaño superior a 100 MB.
  • > ~/resultados: envía toda la salida estándar al archivo ~/resultados, que contendrá la lista de archivos encontrados.
  • &: ejecuta el comando en segundo plano para que recuperes el prompt de tu terminal.

Una vez lanzado, puedes cerrar la terminal o la sesión sin miedo; la búsqueda seguirá trabajando en segundo plano. Más adelante, cuando vuelvas a entrar, podrás revisar el contenido del fichero de resultados con:

cat ~/resultados

Si prefieres que no se genere ningún archivo de salida o quieres tirar la salida estándar y los errores a la basura, puedes redirigirla a /dev/null:

nohup find /home -type f -size +100M > /dev/null 2>&1 &

Con esa combinación de redirecciones, tanto la salida normal como los mensajes de error desaparecen, y el proceso corre en segundo plano ignorando la señal de colgado.

Completar procesos tras cerrar sesión o SSH con nohup

Evitar que un proceso termine al cerrar SSH

El comportamiento por defecto en la mayoría de shells es que los procesos en segundo plano se terminan cuando cierras la terminal, incluso si los has lanzado con &. Esto se ve fácilmente con un ejemplo sencillo usando sleep:

sleep 100 &

Con esto pones en marcha un proceso que simplemente espera 100 segundos. Si ejecutas un ps aux | grep sleep verás el proceso activo. Pero en cuanto cierres la terminal y abras otra, al volver a listar procesos comprobarás que sleep ya no está.

Para que ese mismo comando sobreviva al cierre de la terminal basta con relanzarlo con nohup delante:

nohup sleep 100 &

La propia herramienta te avisará de que está descartando la entrada estándar y que volcará la salida en nohup.out. Si ahora haces un ps aux | grep sleep, verás el proceso en marcha. Cierra la terminal, abre otra y vuelve a listar: el sleep seguirá activo, incluso si entras con otro usuario en una TTY distinta.

Este mismo patrón es clave cuando trabajas por SSH con un servidor remoto, una Raspberry Pi o un VPS. Si, por ejemplo, conectas con:

ssh pi@192.168.1.220

Y quieres lanzar una descarga larga con youtube-dl sin tener que mantener la sesión SSH abierta, puedes hacer algo como:

nohup youtube-dl https://www.youtube.com/playlist?list=LO_QUE_SEA >/dev/null 2>&1 &

Tras ver el identificador del proceso y recuperar el prompt, ya puedes ejecutar exit para cerrar SSH. La descarga continuará sin problemas y podrás desconectarte tranquilamente; luego accederás al servidor para comprobar los ficheros descargados.

Ten en cuenta que algunos programas como wget ya están diseñados para manejar relativamente bien los cortes de sesión dependiendo de cómo los uses, pero con nohup te aseguras de que el proceso no reciba la temida SIGHUP.

Enviar procesos al segundo plano: &, jobs, fg y bg

Más allá de nohup, la shell de Linux tiene su propio sistema de control de trabajos que te permite suspender, reanudar y mover procesos entre primer y segundo plano. Esto no evita por sí solo que se terminen al cerrar la terminal, pero es la base necesaria para combinarlos con disown.

Cuando añades un & al final de un comando, le estás diciendo a la shell que lo ejecute en background. Por ejemplo:

rsync home/music/* usr/otro/home/music/ &

La shell te mostrará algo como [1] 1234, donde [1] es el número de job y 1234 el PID (identificador de proceso). Ese job sigue activo, pero la terminal vuelve a estar libre para que escribas otros comandos.

Si en vez de usar & lanzas el comando normalmente y luego pulsas Ctrl+Z, estarás pausando (suspendiendo) el proceso. Aparecerá un mensaje del estilo:

  Cómo crear un paquete tarball de código paso a paso

[1]+ Stopped gedit

En ese momento el comando está detenido, no ejecutándose. Puedes ver los jobs activos con:

jobs

Para reanudarlo en segundo plano, utilizas bg seguido del número de job:

bg 1

Si quieres devolverlo a primer plano (que recupere el control de la terminal), usarías fg 1. Este manejo de Ctrl+Z, jobs, bg y fg es muy útil cuando trabajas con varias tareas a la vez en una sola terminal.

fg 1

Desvincular un proceso del terminal con disown

El comando interno disown de bash es la pieza que te falta cuando ya tienes un proceso corriendo y decides que no quieres que muera al cerrar la terminal, pero no lo lanzaste inicialmente con nohup. Lo que hace disown es eliminar ese job de la tabla de trabajos de la shell y evitar que reciba la señal de colgado cuando cierres la sesión.

Imagina que abres gedit desde la terminal porque estás editando un archivo rápido:

gedit archivo.txt

La ventana de gedit aparece en tu escritorio, pero si ahora cierras la terminal, el editor también se cerrará. Si quieres conservar gedit abierto y poder cerrar la consola con total tranquilidad, puedes seguir estos pasos:

1. Suspende temporalmente el proceso pulsando Ctrl+Z. Verás algo tipo:

[1]+ Stopped gedit archivo.txt

2. Ejecuta disown -h %1 para desvincular la aplicación de la shell:

disown -h %1

La opción -h indica que el job no debe recibir SIGHUP, y %1 se refiere al job número 1 (el que viste al pulsar Ctrl+Z). Puedes comprobar los jobs con jobs si tienes dudas del número.

3. Manda el proceso al segundo plano para que siga ejecutándose:

bg 1

A partir de aquí, gedit quedará completamente independiente de la terminal. Puedes cerrar sin miedo la consola; la ventana del editor seguirá viva y funcionando. Este truco es ideal para quienes lanzan aplicaciones gráficas habitualmente desde la línea de comandos.

Si ya iniciaste un programa con &, por ejemplo gedit &, te ahorras el paso de bg porque el job ya está en segundo plano, de modo que solo te hará falta el disown -h %n correspondiente.

Otra forma: disown para comandos ya en segundo plano

En tareas pesadas como copias con rsync, a veces te acuerdas de que quieres cerrar la terminal cuando el comando ya está en marcha. Si lo iniciaste con un & desde el principio, separarlo de la consola es todavía más sencillo usando disown a secas.

Por ejemplo, si escribes:

sudo rsync home/music/* usr/otro/home/music/ &

La shell te devolverá el prompt y tú podrás seguir trabajando. Si más tarde decides cerrar la terminal pero sin detener ese rsync, basta con ejecutar:

disown

Sin parámetros adicionales, disown actúa sobre el último job que tienes en la tabla de trabajos. A partir de ese momento, el proceso dejará de estar controlado por la shell y no recibirá la orden de finalización cuando cierres la terminal.

Si quieres ser más explícito o tienes varios jobs en marcha, puedes enumerarlos con:

jobs

Y luego aplicar disown a uno en concreto:

disown %2

En muchos casos puedes elegir entre nohup y disown según el momento en que te acuerdes de que la tarea debe sobrevivir. Si lo piensas antes de lanzarla, usa nohup; si te acuerdas después, recurre a disown.

Multiplexores de terminal: screen, tmux y compañía

Además de nohup y disown, existen herramientas más avanzadas como screen, tmux o byobu que ofrecen una solución diferente al problema: en lugar de desvincular procesos sueltos, crean sesiones de terminal persistentes a las que puedes conectarte y desconectarte cuando quieras.

Con un multiplexor de terminal como tmux o screen puedes abrir una sesión, lanzar en ella todos tus comandos (incluso varios «paneles» o «ventanas» binnen la misma sesión) y después «desacoplarte» (detach). La sesión seguirá ejecutándose en segundo plano en el servidor, con todos los procesos activos, aunque cierres la ventana de terminal o se caiga la conexión SSH.

Más adelante puedes volver a conectarte a esa misma sesión desde otra terminal o desde otro equipo mediante SSH y verás los programas tal y como los dejaste, con su historial de salida aún disponible. Es como si tuvieras una terminal persistente residente en el servidor.

  DeepSeek presenta Fire-Flyer File System (3FS), un sistema de archivos optimizado para IA

Esta aproximación es algo más compleja de aprender que escribir simplemente nohup, pero si trabajas con servidores remotos a menudo, mantener procesos largos, sesiones interactivas (como editores de texto en modo texto) o herramientas de monitorización en marcha resulta infinitamente más cómodo.

Entre screen y tmux, muchos administradores modernos se inclinan por tmux por ser más flexible y activo en desarrollo, mientras que byobu ofrece una capa de «amabilidad» adicional sobre ellos con atajos más descriptivos y barra de estado integrada.

Controlar paginadores como less al consultar servicios

Otro comportamiento que confunde mucho a usuarios relativamente nuevos es el de ciertos comandos que usan un paginador como less para mostrar la salida. Un caso típico es el de systemctl status sshd en distribuciones modernas como Fedora, que abre la salida en una especie de «visor» que indica algo como «Líneas 1-22/22 [FIN]».

En este escenario, el comando no está colgado, simplemente estás dentro de less (u otro paginador) viendo el contenido. Para salir y volver al prompt sin cerrar la terminal, solo tienes que pulsar:

Q

La letra «q» (de quit) cierra el paginador y te devuelve a la shell de toda la vida. No hace falta matar la terminal ni abrir una nueva; este comportamiento está pensado precisamente para que puedas moverte por la salida con las flechas, repaginar, buscar texto, etc.

En muchos comandos del sistema (logs, estados de servicios, registros de sistema…) verás patrones similares. Cuando te aparezca un mensaje indicando número de líneas, porcentaje o [FIN], piensa en less y en pulsar q antes de hacer algo más drástico.

Casos típicos de uso en el día a día

En la práctica, estas herramientas se combinan para resolver situaciones muy concretas que se repiten una y otra vez cuando trabajas en Linux. Algunos ejemplos típicos:

1. Copias o sincronizaciones largas (rsync, cp, mv)
Quieres copiar gigas de datos entre directorios o discos y necesitas cerrar tu sesión gráfica. Puedes lanzar:

nohup rsync -avh /origen/ /destino/ > ~/rsync.log 2>&1 &

Así obtienes un log de lo que ha hecho rsync y puedes desconectarte sin matar la copia.

2. Búsquedas pesadas (find, du, scripts de análisis)
Para inspeccionar el uso de disco o localizar ficheros enormes en toda la partición, el uso de nohup con redirección a un fichero de resultados es casi obligado si sabes que se va a alargar.

3. Descargas masivas o scripts remotos por SSH
Arrancar youtube-dl, wget o scripts largos en un servidor remoto y luego descolgarte es una de las mejores ventajas de nohup en combinación con SSH.

4. Aplicaciones gráficas abiertas desde la terminal
Si eres de los que abre editores, navegadores o herramientas gráficas desde la consola, disown es tu mejor amigo para no dejar la terminal ocupando espacio en el escritorio sin motivo.

5. Sesiones de trabajo largas en servidores
Cuando encadenas varios comandos interactivos o sesiones de monitorización, a menudo es más cómodo usar screen o tmux para no preocuparte de qué pasará si se corta tu conexión.

Dominar estos recursos te permite trabajar de forma más tranquila, sin miedo a perder horas de proceso por cerrar una ventana equivocada o porque tu conexión WiFi haya decidido tomarse un descanso.

Al final, la idea general es muy sencilla: en Linux, los procesos se atan por defecto a la terminal que los lanza y mueren cuando esa terminal se cierra, pero dispones de varios mecanismos para romper ese vínculo. nohup y disown cubren la mayoría de casos de uso cotidianos, y los multiplexores como tmux o screen dan un paso más allá ofreciendo sesiones persistentes. Sumando a eso el control de jobs (Ctrl+Z, bg, fg) y el manejo de paginadores como less, puedes mantener tus comandos y aplicaciones ejecutándose sin sobresaltos aunque cierres la terminal, cierres sesión o pierdas la conexión SSH.