Ricerca nel sito web

5 modi per mantenere in esecuzione sessioni e processi SSH remoti dopo la disconnessione


SSH o Secure Shell in termini semplici è un modo con cui una persona può accedere in remoto a un altro utente su un altro sistema ma solo nella riga di comando, ovvero in modalità non GUI. In termini più tecnici, quando ci colleghiamo via SSH ad un altro utente su un altro sistema ed eseguiamo comandi su quella macchina, in realtà crea uno pseudo-terminale e lo collega alla shell di accesso dell'utente che ha effettuato l'accesso.

Quando ci disconnettiamo dalla sessione o la sessione scade dopo essere rimasta inattiva per un certo periodo, il segnale SIGHUP viene inviato allo pseudo-terminale e tutti i lavori che sono stati eseguiti su quel terminale, anche anche i lavori i cui lavori principali vengono avviati sullo pseudo-terminale ricevono il segnale SIGHUP e vengono forzati a terminare.

Da non perdere: 5 pratiche utili per mantenere il server SSH sicuro e protetto

Solo i lavori che sono stati configurati per ignorare questo segnale sono quelli che sopravvivono alla terminazione della sessione. Sui sistemi Linux, possiamo avere molti modi per eseguire questi lavori sul server remoto o su qualsiasi macchina anche dopo il logout dell'utente e la terminazione della sessione.

Comprendere i processi su Linux

Processo normale

I processi normali sono quelli che hanno la durata di una sessione. Vengono avviati durante la sessione come processi in primo piano e terminano in un determinato intervallo di tempo o quando la sessione viene disconnessa. Questi processi hanno come proprietario qualsiasi utente valido del sistema, incluso root.

Processo orfano

I processi orfani sono quelli che inizialmente avevano un genitore che ha creato il processo ma dopo un po' di tempo il processo genitore è morto o si è bloccato involontariamente, rendendo init il genitore di quel processo. Tali processi hanno init come genitore immediato che attende questi processi finché non muoiono o finiscono.

Processo del demone

Questi sono alcuni processi intenzionalmente orfani, tali processi che vengono lasciati intenzionalmente in esecuzione sul sistema sono definiti demoni o processi intenzionalmente orfani. Di solito sono processi di lunga durata che una volta avviati e poi scollegati da qualsiasi terminale di controllo in modo che possano essere eseguiti in background fino a quando non vengono completati o finiscono per generare un errore. Il genitore di tali processi muore intenzionalmente facendo eseguire il bambino in background.

Tecniche per mantenere la sessione SSH in esecuzione dopo la disconnessione

Esistono vari modi per lasciare le sessioni ssh in esecuzione dopo la disconnessione, come descritto di seguito:

1. Utilizzo del comando sullo schermo per mantenere in esecuzione le sessioni SSH

screen è un gestore di finestre di testo per Linux che consente all'utente di gestire più sessioni di terminale contemporaneamente, passando da una sessione all'altra, registrando le sessioni in corso sullo schermo e persino riprendendo la sessione in qualsiasi momento desideriamo senza preoccuparsi che la sessione venga disconnessa o che il terminale venga chiuso.

le sessioni dello schermo possono essere avviate e poi staccate dal terminale di controllo lasciandole in esecuzione in background per poi essere riprese in qualsiasi momento e anche in qualsiasi luogo. Basta avviare la sessione sullo schermo e, quando vuoi, staccarlo dallo pseudo-terminale (o dal terminale di controllo) ed effettuare il logout. Quando ti senti, puoi effettuare nuovamente l'accesso e riprendere la sessione.

Avvio di una sessione di schermo

Dopo aver digitato il comando 'screen', ti troverai in una nuova sessione dello schermo, all'interno di questa sessione potrai creare nuove finestre, spostarti tra le finestre, bloccare lo schermo e fare molte altre cose che puoi fare su un terminale normale.

screen

Una volta avviata la sessione dello schermo, puoi eseguire qualsiasi comando e mantenere la sessione in esecuzione scollegando la sessione.

Distacco di uno schermo

Proprio quando vuoi disconnetterti dalla sessione remota, ma vuoi mantenere viva la sessione che hai creato su quella macchina, quello che devi fare è staccare lo schermo dal terminale in modo che non rimanga alcun terminale di controllo. Dopo aver fatto ciò, puoi tranquillamente disconnetterti.

Per staccare uno schermo dal terminale remoto, basta premere “Ctrl+a ” seguito immediatamente da “d ” e tornerai al terminale vedendo il messaggio che lo schermo è distaccato. Ora puoi disconnetterti in tutta sicurezza e la tua sessione rimarrà attiva.

Ripresa della sessione con schermo scollegato

Se desideri riprendere una sessione con schermo separato che avevi lasciato prima di disconnetterti, accedi nuovamente al terminale remoto e digita “screen -r ” nel caso in cui venga aperta una sola schermata e se più quando si aprono le sessioni screen eseguire “screen -r .

screen -r
screen -r <pid.tty.host>

Per saperne di più sul comando screen e su come usarlo basta seguire il collegamento: Usa il comando screen per gestire le sessioni del terminale Linux

2. Utilizzo di Tmux (multiplexer terminale) per mantenere in esecuzione le sessioni SSH

Tmux è un altro software creato per sostituire screen. Ha la maggior parte delle funzionalità di screen, con poche funzionalità aggiuntive che lo rendono più potente di screen.

Consente, oltre a tutte le opzioni offerte dallo schermo, di dividere i riquadri orizzontalmente o verticalmente tra più finestre, ridimensionare i riquadri delle finestre, monitorare l'attività della sessione, creare script utilizzando la modalità riga di comando ecc. Grazie a queste funzionalità di tmux, ha goduto di un'ampia adozione da parte di quasi tutte le distribuzioni Unix e anch'esso è stato incluso nel sistema base di OpenBSD.

Avvia una sessione Tmux

Dopo aver eseguito ssh sull'host remoto e aver digitato tmux, entrerai in una nuova sessione con una nuova finestra che si aprirà davanti a te, in cui potrai fare tutto ciò che fai su un normale terminale.

tmux

Dopo aver eseguito le operazioni sul terminale, puoi scollegare quella sessione dal terminale di controllo in modo che vada in background e puoi disconnetterti in sicurezza.

Scollega la sessione Tmux dal terminale

Puoi eseguire “tmux detach ” durante l'esecuzione della sessione tmux oppure puoi utilizzare la scorciatoia (Ctrl+b quindi d). Successivamente la sessione corrente verrà scollegata e tornerai al tuo terminale da dove potrai disconnetterti in sicurezza.

tmux detach

Ripresa della sessione Tmux chiusa

Per riaprire la sessione che avevi scollegato e lasciato così com'era quando ti sei disconnesso dal sistema, accedi nuovamente al computer remoto e digita "tmux attach " per ricollegarti alla sessione chiusa e sarà ancora lì e funzionerà.

tmux attach

Per saperne di più su tmux e su come usarlo basta seguire il collegamento: Usa Tmux Terminal Multiplexer per gestire più terminali Linux.

3. Utilizzo del comando nohup per continuare a eseguire sessioni SSH

Se non hai molta familiarità con screen o tmux, puoi utilizzare nohup e inviare il tuo comando a lunga esecuzione in background in modo da poter continuare mentre il comando continuerà ad essere eseguito in background. Dopodiché potrai tranquillamente disconnetterti.

Con il comando nohup diciamo al processo di ignorare il segnale SIGHUP che viene inviato dalla sessione ssh al termine, rendendo così il comando persistente anche dopo il logout della sessione. Alla disconnessione della sessione il comando viene scollegato dal terminale di controllo e continua a essere eseguito in background come processo daemon.

Esecuzione del comando utilizzando nohup in background

Ecco uno scenario semplice in cui abbiamo eseguito il comando find per cercare file in background nella sessione ssh utilizzando nohup, dopodiché l'attività è stata inviata in background con un prompt che ritorna immediatamente fornendo PID e job ID del processo ([JOBID] PID).

nohup find / -type f $gt; files_in_system.out 2>1 &

Ripresa della sessione per vedere se il lavoro è ancora in esecuzione

Quando accedi nuovamente, puoi controllare lo stato del comando, riportarlo in primo piano usando 'fg %JOBID' per monitorarne l'avanzamento e così via. Di seguito, l'output mostra che il lavoro è stato completato poiché non viene visualizzato al nuovo accesso e ha fornito l'output che viene visualizzato.

fg %JOBID

4. Utilizzo del comando disown per mantenere attive le sessioni SSH

Un altro modo elegante per consentire che il tuo comando o una singola attività venga eseguita in background e rimanga attiva anche dopo il logout o la disconnessione della sessione è utilizzare disown.

Disown, rimuove il lavoro dall'elenco dei lavori di processo del sistema, quindi il processo è protetto dall'essere ucciso durante la disconnessione della sessione poiché non riceverà SIGHUP dalla shell quando ti disconnetti.

Lo svantaggio di questo metodo è che dovrebbe essere utilizzato solo per i lavori che non richiedono alcun input da stdin e non necessitano nemmeno di scrivere su stdout, a meno che non si reindirizzi specificamente input e output dei lavori, perché quando il lavoro tenterà di interagire con stdin o stdout, si fermerà.

Esecuzione del comando utilizzando disown in background

Di seguito, abbiamo inviato il comando ping in background in modo che ut continui a funzionare e venga rimosso dall'elenco dei lavori. Come visto, il lavoro è stato prima sospeso, dopodiché era ancora nell'elenco dei lavori come ID processo: 15368.

ping linux-console.net > pingout &
jobs -l
disown -h %1
ps -ef | grep ping

Dopo che il segnale di rinnegamento è stato passato al lavoro ed è stato rimosso dall'elenco dei lavori, sebbene fosse ancora in esecuzione in background. Il lavoro sarebbe ancora in esecuzione quando si accede nuovamente al server remoto come mostrato di seguito.

ps -ef | grep ping

5. Utilizzo del comando setsid per mettere in esecuzione le sessioni SSH

Un'altra utilità per ottenere il comportamento richiesto è setsid. Nohup ha uno svantaggio nel senso che il gruppo di processi rimane lo stesso, quindi il processo in esecuzione con nohup è vulnerabile a qualsiasi segnale inviato all'intero gruppo di processi (come Ctrl + C< /codice>).

setsid d'altra parte alloca un nuovo gruppo di processi al processo in esecuzione e quindi, il processo creato è totalmente in un gruppo di processi appena allocato e può essere eseguito in modo sicuro senza timore di essere ucciso anche dopo la disconnessione della sessione.

Esegui qualsiasi comando utilizzando setsid

Qui mostra che il processo 'sleep 10m' è stato staccato dal terminale di controllo, dal momento in cui è stato creato.

setsid sleep 10m
ps -ef | grep sleep

Ora, quando accedi nuovamente alla sessione, troverai questo processo ancora in esecuzione.

ps -ef | grep [s]leep

Conclusione

Quali modi potresti pensare per mantenere il tuo processo in esecuzione anche dopo esserti disconnesso dalla sessione SSH? Se ti viene in mente un altro modo efficace, menzionalo nei tuoi commenti.