5 maneres de mantenir les sessions i els processos SSH remots en execució després de la desconnexió


SSH o Secure Shell en termes senzills és una manera per la qual una persona pot accedir de manera remota a un altre usuari en un altre sistema, però només en línia d'ordres, és a dir, en mode no GUI. En termes més tècnics, quan connectem a un altre usuari en algun altre sistema i executem ordres en aquesta màquina, en realitat crea un pseudo-terminal i l'adjunta a l'intèrpret d'ordres d'inici de sessió de l'usuari connectat.

Quan tanquem la sessió o s'esgota la sessió després d'estar inactiu durant força temps, el senyal SIGHUP s'envia al pseudoterminal i tots els treballs que s'han executat en aquest terminal, fins i tot els treballs que tenen els seus treballs pare. que s'inicien al pseudoterminal també s'envia el senyal SIGHUP i es veuen obligats a finalitzar.

Només els treballs que s'han configurat per ignorar aquest senyal són els que sobreviuen a la finalització de la sessió. Als sistemes Linux, podem tenir moltes maneres de fer que aquests treballs s'executin al servidor remot o a qualsevol màquina, fins i tot després de la sessió de l'usuari i la finalització de la sessió.

Entendre els processos a Linux

Els processos normals són aquells que tenen la vida útil d'una sessió. S'inicien durant la sessió com a processos en primer pla i acaben en un període de temps determinat o quan es tanca la sessió. Aquests processos tenen el seu propietari com a qualsevol dels usuaris vàlids del sistema, inclòs el root.

Els processos orfes són aquells que inicialment tenien un pare que va crear el procés, però després d'un temps, el procés principal va morir o es va estavellar sense voler, fent que init fos el pare d'aquest procés. Aquests processos tenen init com a pare immediat que espera en aquests processos fins que moren o acabin.

Aquests són alguns processos intencionadament orfes, aquests processos que es deixen executant intencionadament al sistema s'anomenen processos de dimoni o intencionadament orfes. Normalment són processos de llarga durada que s'inicien i després es desconnecten de qualsevol terminal de control perquè es puguin executar en segon pla fins que no s'acabin o acaben generant un error. El pare d'aquests processos mor intencionadament fent que el nen s'executi en segon pla.

Tècniques per mantenir la sessió SSH en funcionament després de la desconnexió

Hi pot haver diverses maneres de deixar en funcionament les sessions ssh després de la desconnexió, tal com es descriu a continuació:

screen és un gestor de finestres de text per a Linux que permet a l'usuari gestionar diverses sessions de terminal al mateix temps, canviar entre sessions, registrar sessions per a les sessions en execució a la pantalla i, fins i tot, reprendre la sessió en qualsevol moment que desitgem sense preocupar-nos que la sessió es registri. fora o tancament de la terminal.

Les sessions de pantalla es poden iniciar i després desconnectar del terminal de control, deixant-les en execució en segon pla i després reprendre en qualsevol moment i fins i tot en qualsevol lloc. Només heu d'iniciar la sessió a la pantalla i, quan vulgueu, desconnecteu-la del pseudoterminal (o del terminal de control) i tanqueu la sessió. Quan us sentiu, podeu tornar a iniciar sessió i reprendre la sessió.

Després d'escriure l'ordre pantalla, estareu en una nova sessió de pantalla, dins d'aquesta sessió podeu crear noves finestres, passar entre finestres, bloquejar la pantalla i fer moltes més coses que podeu fer en un terminal normal.

$ screen

Un cop iniciat la sessió de pantalla, podeu executar qualsevol ordre i mantenir la sessió en funcionament desconnectant la sessió.

Just quan voleu tancar la sessió de la sessió remota, però voleu mantenir viva la sessió que heu creat en aquesta màquina, el que heu de fer és desconnectar la pantalla del terminal perquè no quedi cap terminal de control. Després de fer-ho, podeu tancar la sessió amb seguretat.

Per desconnectar una pantalla del terminal remot, només cal que premeu \Ctrl+a seguida immediatament de \d i tornareu al terminal veient el missatge que la pantalla està deslligada. Ara podeu tancar la sessió amb seguretat i la vostra sessió es deixarà viva.

Si voleu reprendre una sessió de pantalla separada que vau deixar abans de tancar la sessió, torneu a iniciar la sessió al terminal remot de nou i escriviu \pantalla -r per si només s'obre una pantalla, i si s'obren diverses sessions de pantalla executeu \screen -r .

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

Per obtenir més informació sobre l'ordre de pantalla i com utilitzar-lo, només cal que seguiu l'enllaç: Utilitzeu l'ordre de la pantalla per gestionar les sessions de terminal de Linux

Tmux és un altre programari creat per substituir la pantalla. Té la majoria de les capacitats de la pantalla, amb poques capacitats addicionals que la fan més potent que la pantalla.

Permet, a part de totes les opcions que ofereix la pantalla, dividir els panells horitzontalment o verticalment entre diverses finestres, canviar la mida dels panells de la finestra, supervisar l'activitat de la sessió, crear scripts mitjançant el mode de línia d'ordres, etc. totes les distribucions Unix i fins i tot s'ha inclòs al sistema base d'OpenBSD.

Després de fer ssh a l'amfitrió remot i escriure tmux, entrareu en una nova sessió amb una nova finestra oberta davant vostre, on podeu fer qualsevol cosa que feu en un terminal normal.

$ tmux

Després de realitzar les vostres operacions al terminal, podeu desconnectar aquesta sessió del terminal de control perquè passi en segon pla i pugueu tancar la sessió amb seguretat.

O podeu executar \tmux detach en executar la sessió de tmux o podeu utilitzar la drecera (Ctrl+b i després d). Després d'això, la vostra sessió actual es desconnectarà i tornaràs al teu terminal des d'on podràs tancar la sessió amb seguretat.

$ tmux detach

Per tornar a obrir la sessió que vau desconnectar i vau deixar tal com estava quan vau tancar la sessió del sistema, només heu de tornar a iniciar sessió a la màquina remota i escriviu \tmux attach per tornar a connectar-vos a la sessió tancada i encara estarà allà i corrent.

$ tmux attach

Per obtenir més informació sobre tmux i com utilitzar-lo, només cal que seguiu l'enllaç: Utilitzeu Tmux Terminal Multiplexer per gestionar diversos terminals Linux.

Si no esteu tan familiaritzat amb screen o tmux, podeu utilitzar nohup i enviar la vostra ordre d'execució llarga en segon pla perquè pugueu continuar mentre l'ordre continuarà executant-se en segon pla. Després d'això, podeu tancar la sessió amb seguretat.

Amb l'ordre nohup diem al procés que ignori el senyal SIGHUP que s'envia per la sessió ssh en finalitzar, fent que l'ordre persisteixi fins i tot després de tancar la sessió. Quan es tanca la sessió, l'ordre es desconnecta del terminal de control i es continua executant en segon pla com a procés dimoni.

Aquí, hi ha un escenari senzill en què hem executat l'ordre find per cercar fitxers en segon pla a la sessió ssh mitjançant nohup, després de la qual cosa la tasca es va enviar a segon pla amb un missatge que tornava immediatament donant PID i ID de treball del procés ([ JOBID] PID).

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

Quan torneu a iniciar sessió, podeu comprovar l'estat de l'ordre, tornar-lo a primer pla utilitzant fg %JOBID per supervisar-ne el progrés, etc. A continuació, la sortida mostra que el treball s'ha completat, ja que no es mostra en tornar a iniciar sessió i ha donat la sortida que es mostra.

# fg %JOBID

Una altra manera elegant de deixar que la vostra ordre o una única tasca s'executi en segon pla i es mantingui viva fins i tot després de tancar la sessió o desconnectar-la és utilitzant desactivació.

Disown, elimina la tasca de la llista de tasques de procés del sistema, de manera que el procés està protegit de la mort durant la desconnexió de la sessió, ja que no rebrà SIGHUP per l'intèrpret d'ordres quan tanqueu la sessió.

El desavantatge d'aquest mètode és que només s'ha d'utilitzar per als treballs que no necessiten cap entrada de l'stdin i que tampoc cal escriure a stdout, tret que redirigeixi específicament l'entrada i la sortida de treballs, perquè quan el treball intentarà interactuar amb stdin. o stdout, s'aturarà.

A continuació, vam enviar l'ordre ping al segon pla perquè ut continuï funcionant i s'elimini de la llista de treballs. Com s'ha vist, la feina es va suspendre primer, després de la qual cosa encara estava a la llista de treballs com a ID de procés: 15368.

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

Després d'aquest senyal de rebuig es va passar a la feina i es va eliminar de la llista de treballs, tot i que encara s'executava en segon pla. La feina encara s'està executant quan torneu a iniciar sessió al servidor remot, tal com es veu a continuació.

$ ps -ef | grep ping

Una altra utilitat per aconseguir el comportament requerit és setsid. Nohup té un desavantatge en el sentit que el grup de processos del procés segueix sent el mateix, de manera que el procés que s'executa amb nohup és vulnerable a qualsevol senyal enviat a tot el grup de processos (com Ctrl + C).

setsid, d'altra banda, assigna un nou grup de processos al procés que s'està executant i, per tant, el procés creat està totalment en un grup de processos recentment assignat i es pot executar de manera segura sense por de morir fins i tot després de tancar la sessió.

Aquí, mostra que el procés ‘sleep 10m’ s’ha desvinculat del terminal de control, des del moment en què s’ha creat.

$ setsid sleep 10m
$ ps -ef | grep sleep

Ara, quan torneu a iniciar sessió a la sessió, encara trobareu aquest procés en execució.

$ ps -ef | grep [s]leep

Conclusió

Quines maneres podríeu pensar per mantenir el vostre procés en funcionament fins i tot després de tancar la sessió de SSH? Si hi ha alguna altra manera eficaç que us sembli, feu-ne una menció als vostres comentaris.