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 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 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 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 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 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 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
nohupsin 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.disownno 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.