Come mantenere attiva una sessione SSH dopo la disconnessione con tmux

Esegui tmux new -A -s work sul server e lavora al suo interno. tmux continua a girare sul server, quindi una connessione caduta non ferma i tuoi programmi. Dopo aver effettuato di nuovo il login, lo stesso comando ti riporta nella sessione. Per uscire di proposito lasciandola attiva, premi Ctrl+b e poi d.

Aggiornata il . tmux 3.5a e nohup su Debian 13 in un container usa e getta, disconnettendosi con la chiusura forzata del client OpenSSH su macOS.

Perché i programmi si fermano quando SSH cade

Un programma avviato in una sessione SSH è legato al terminale di quella sessione. Quando la connessione finisce, il terminale si chiude e il programma di norma riceve un segnale di hangup e si ferma. tmux invece tiene il terminale sul server, così la connessione può andare e venire.

tmux deve girare sul server, non sul tuo portatile. Installalo con sudo apt install tmux o sudo dnf install tmux.

I comandi che servono

OperazioneComando
Collegarsi alla sessione work, o crearlatmux new -A -s work
Staccarsi lasciandola attivaCtrl+b, poi d
Elencare le sessionitmux ls
Collegarsi a una sessione esistentetmux attach -t work
Avviare una sessione in backgroundtmux new -d -s work
Chiudere una sessionetmux kill-session -t work
Chiudere tutte le sessionitmux kill-server
Scorrere indietroCtrl+b, poi [, e q per uscire

tmux new -A -s work è quello da ricordare, perché funziona sia che la sessione esista già sia che non esista. Puoi anche andarci direttamente dal tuo computer:

ssh -t user@server tmux new -A -s work

Il -t è obbligatorio, perché tmux ha bisogno di un terminale.

Come appare una vera disconnessione

Abbiamo avviato un ciclo dentro tmux, poi abbiamo chiuso il client SSH con kill -9 per imitare una connessione persa. Da un nuovo login:

$ tmux ls
work: 1 windows (created Tue Nov  3 18:22:28 2026)

(attached) è sparito dalla riga, perché nessun client è collegato, e il ciclo stava ancora scrivendo nel suo file. Quando non esiste nessuna sessione, tmux ls dice no server running on /tmp/tmux-1000/default. Significa che le tue sessioni sono terminate, per esempio dopo un riavvio.

tmux non sopravvive al riavvio del server. Muore anche all'uscita se il sistema chiude i processi dell'utente, con KillUserProcesses=yes in logind.conf. Debian e Ubuntu lo hanno disattivato di serie. Se tmux muore a ogni uscita, rimettilo a no.

Senza tmux: nohup

Per un singolo job di cui non serve rivedere lo schermo:

nohup ./job.sh > job.log 2>&1 &

Nel nostro test abbiamo avviato tre job in una sessione e chiuso la connessione. Il job con nohup è terminato e ha scritto il suo log. Il job in background semplice con & e quello in primo piano sono morti entrambi.

Se hai già avviato un job con & e hai dimenticato nohup, questo builtin di bash lo protegge dal segnale di hangup:

disown -h %1

Il suo output va comunque al vecchio terminale, quindi un job che scrive molto a schermo può fallire dopo che te ne sei andato. Con entrambi i metodi non hai modo di interagire con il job in seguito.

Con systemd: systemd-run

Se hai sudo, puoi eseguire il job come servizio temporaneo. È allora del tutto separato dal tuo login, e systemd ne conserva l'output:

sudo systemd-run --unit=longjob /usr/local/bin/job.sh
systemctl status longjob
journalctl -u longjob -f

Gira come root a meno che non aggiungi --uid=user, e parte in / a meno che non imposti una cartella con --working-directory=, quindi usa percorsi completi.

Quando il job termina con successo, l'unità scompare: nel nostro test systemctl status longjob diceva allora Unit longjob.service could not be found, ma journalctl -u longjob aveva ancora l'output. Un job fallito resta nell'elenco finché non esegui sudo systemctl reset-failed longjob.

Quale usare

  • tmux per il lavoro interattivo: editor, shell di database, tutto ciò a cui vuoi tornare.
  • nohup per un singolo job su un server dove non puoi installare nulla.
  • systemd-run per un job lungo di cui vuoi il log e che deve restare separato dal tuo login.

Se è la connessione stessa a cadere di continuo, vedi Broken pipe e keep-alive. tmux mette al sicuro il tuo lavoro, e le impostazioni di keep-alive rendono le cadute meno frequenti. Su una rete che cambia spesso, Mosh con tmux sul server tiene in vita sia la connessione sia il lavoro.

Domande

Come mi ricollego a tmux dopo una disconnessione SSH?

Accedi di nuovo ed esegui tmux attach -t work, oppure tmux new -A -s work, che crea anche la sessione se non c'è più. tmux ls elenca le sessioni ancora attive.

tmux sopravvive al riavvio del server?

No. tmux è un normale processo sul server, quindi un riavvio chiude tutte le sessioni. Per un lavoro che deve ripartire dopo un riavvio, usa un servizio systemd.

Perché la sessione tmux sparisce quando esco?

Probabilmente il sistema chiude i processi dell'utente all'uscita, con KillUserProcesses=yes in /etc/systemd/logind.conf. Imposta no, poi riavvia systemd-logind o il server.

Come lascio un comando in esecuzione dopo aver chiuso SSH senza tmux?

Avvialo con nohup ./job.sh > job.log 2>&1 &. Continua dopo l'uscita e scrive l'output in job.log, ma non puoi tornare alla sua schermata.

Serve tmux sul mio computer?

No. tmux deve girare sul server. Al tuo computer basta un client SSH.

Fonti

Altro in Sessioni e tmux

Tutte le guide