CLI AI

Cómo dejar un comando corriendo tras salir de SSH

2026-05-29

Para ejecutar un comando en segundo plano después de cerrar sesión SSH, lo más simple es nohup ./import.sh > import.log 2>&1 & — sirve cuando ya sabes de antemano que el proceso va a sobrevivir a la sesión. Pero hay otras cinco situaciones que ese comando no resuelve: desde acordarte de nohup demasiado tarde hasta necesitar que el proceso sobreviva no solo al cierre de SSH, sino también a un reinicio.

1. Sé de antemano que el proceso será largo

clai
$ clai ejecuta este script para que sobreviva a una desconexión ssh, y guarda la salida en un archivo→ nohup ./import.sh > import.log 2>&1 &

nohup intercepta la señal SIGHUP que recibe el proceso cuando se cierra la terminal. & lo manda a segundo plano. La redirección no es opcional: sin ella, la salida termina en nohup.out en el directorio actual, y luego tienes que ir a buscarla.

2. Ya lo lancé y me olvidé de nohup

clai
$ clai desvincula el proceso que ya lancé, se me olvidó nohup→ Ctrl+Z; bg; disown -h %1

Ctrl+Z lo suspende, bg lo reanuda en segundo plano, disown -h lo saca de la tabla de trabajos del shell para que no reciba SIGHUP. Es la opción de rescate cuando el proceso lleva una hora corriendo y matarlo no es una opción.

3. Necesito desvincularlo por completo de la sesión

clai
$ clai ejecuta este comando en su propia sesión, totalmente desvinculada de la terminal→ setsid --fork ./import.sh > import.log 2>&1

setsid crea una nueva sesión y un nuevo grupo de procesos, así que el proceso nunca recibe señales de terminal. Más radical que nohup: de entrada no tiene terminal de control que perder.

4. Necesito volver más tarde a verlo

clai
$ clai ejecuta esto en segundo plano para poder reconectarme después y ver cómo va→ tmux new -d -s import './import.sh'

-d crea la sesión desconectada. Después, tmux attach -t import te devuelve directo a la terminal viva donde corre el proceso. Es la única opción de la lista donde puedes interactuar, no solo mirar.

5. Quiero que systemd lo supervise

clai
$ clai ejecuta esto como un servicio systemd temporal, con logs y estado→ systemd-run --user --unit=import ./import.shRunning as unit: import.service; invocation ID: 74282bc256f144cdb323c19fc09452af

Obtienes el log con journalctl --user -u import, el estado con systemctl --user status import, y reinicios automáticos si los quieres. La mejor opción para lo que tiene que sobrevivir tanto a tu sesión como a un reinicio.

6. Comprobar si el proceso está realmente desvinculado

clai
$ clai comprueba si este proceso está realmente desvinculado de la terminal→ ps -o pid,ppid,sid,tty,comm -p 12345

Si la columna TTY muestra ?, no hay terminal de control y una desconexión no le afecta. Si muestra pts/0, sigue atado a tu sesión y morirá con ella.

Trampas

  • nohup sin redirección escribe en nohup.out. El archivo se crea en el directorio actual, o en el de inicio si ahí no se puede escribir. Fija la ruta explícitamente.
  • disown no protege contra un SIGHUP que ya se envió. Solo saca el trabajo del registro del shell. Si ya cerraste la terminal, es tarde.
  • tmux y screen mueren con un reinicio. Para algo que tiene que sobrevivir a un reboot hace falta una unidad de systemd, no un multiplexor.

Preguntas relacionadas

¿nohup o tmux? nohup es "lánzalo y olvídate", con salida a un archivo. tmux es para cuando necesitas volver a un proceso vivo y escribirle algo.

¿Por qué el proceso murió igual después de salir? O no fue SIGHUP — murió junto con su padre — o falló solo. Revisa el log, si lo redirigiste.

¿Cómo veo la salida de un proceso en segundo plano que ya está corriendo? Si va a un archivo, usa tail -f. Si no va a ningún lado, puedes espiarla con strace -p PID -e write o los descriptores en /proc/PID/fd.

Ver también

CliAI no te va a recordar poner nohup, pero elige la herramienta correcta para la situación antes de que ejecutes nada. Instálalo en una línea.