5 načina za održavanje udaljenih SSH sesija i procesa koji se izvode nakon prekida veze


Jednostavno rečeno, SSH ili Secure Shell način je na koji osoba može daljinski pristupiti drugom korisniku na drugom sustavu, ali samo u naredbenom retku, tj. Ne-GUI načinu. U tehničkim terminima, kada preusmjerimo na drugog korisnika na nekom drugom sustavu i pokrenemo naredbe na tom stroju, on zapravo kreira pseudo-terminal i priključi ga na prijavnu ljusku korisnika koji je prijavljen.

Kada se odjavimo iz sesije ili sesija istekne nakon što neko vrijeme ne radi, signal SIGHUP šalje se na pseudo-terminal i sve poslove koji su pokrenuti na tom terminalu, čak i poslovi koji imaju roditeljske poslove koji su pokrenuti na pseudo-terminalu također se šalju signal SIGHUP i prisiljeni su prekinuti.

Prestanak sesije preživljavaju samo poslovi koji su konfigurirani za ignoriranje ovog signala. Na Linux sustavima možemo imati mnogo načina da ove poslove pokrenemo na udaljenom poslužitelju ili bilo kojem stroju čak i nakon odjave korisnika i prekida sesije.

Razumijevanje procesa na Linuxu

Uobičajeni procesi su oni koji imaju životni vijek sesije. Pokreću se tijekom sesije kao procesi u prvom planu i završavaju u određenom vremenskom rasponu ili kad se sesija odjavi. Ti su procesi vlasnici bilo kojeg valjanog korisnika sustava, uključujući root.

Siroti procesi su oni koji su u početku imali roditelja koji je stvorio proces, ali nakon nekog vremena, roditeljski proces nenamjerno je umro ili se srušio, čineći init roditeljem tog procesa. Takvi procesi imaju inicijaciju kao neposrednog roditelja koji ih čeka dok ne umru ili završe.

To su neki namjerno osiroteli procesi, takvi procesi koji namjerno ostanu aktivni u sustavu nazivaju se demonima ili namjerno osirotelim procesima. To su obično dugotrajni procesi koji se jednom pokrenu, a zatim odvoje od bilo kojeg upravljačkog terminala, tako da mogu raditi u pozadini dok se ne dovrše ili na kraju izbace pogrešku. Roditelj takvih procesa namjerno umire čineći da dijete pogubi u pozadini.

Tehnike za održavanje SSH sesije nakon prekida veze

Postoje različiti načini da ssh sesije ostanu aktivne nakon prekida, kao što je opisano u nastavku:

screen je program za upravljanje tekstom Windowsa za Linux koji korisniku omogućuje istovremeno upravljanje više terminala, prebacivanje između sesija, bilježenje sesija za pokrenute sesije na ekranu, pa čak i nastavak sesije u bilo kojem trenutku koje želimo, ne brinući se zbog sesije koja je zabilježena izlaz ili terminal zatvoren.

sesije zaslona mogu se pokrenuti, a zatim odvojiti od upravljačkog terminala, ostavljajući ih da rade u pozadini, a zatim ih nastaviti u bilo koje vrijeme, pa čak i na bilo kojem mjestu. Samo trebate započeti sesiju na ekranu i kada želite, odvojite je od pseudo-terminala (ili upravljačkog terminala) i odjavite se. Kad osjetite, možete se ponovo prijaviti i nastaviti sesiju.

Nakon upisivanja naredbe 'screen', bit ćete u novoj zaslon zaslona, u okviru te sesije možete stvoriti nove prozore, prelaziti između prozora, zaključati zaslon i raditi još mnogo toga što možete raditi na uobičajenom terminalu.

$ screen

Jednom kada je sesija zaslona započela, možete pokrenuti bilo koju naredbu i održavati sesiju odvajanjem sesije.

Taman kada se želite odjaviti iz udaljene sesije, ali želite održati sesiju koju ste stvorili na tom računalu, tada samo ono što trebate jest odvojiti zaslon od terminala tako da više nema upravljački terminal. Nakon što to napravite, možete se sigurno odjaviti.

Da biste odvojili zaslon od udaljenog terminala, samo pritisnite "Ctrl + a" odmah nakon čega slijedi "d" i vratit ćete se na terminal vidjevši poruku da se zaslon je odvojena. Sada se možete sigurno odjaviti i vaša sesija će ostati živa.

Ako želite nastaviti sesiju odvojenog zaslona koju ste ostavili prije odjave, samo se ponovo prijavite na udaljeni terminal i upišite “screen -r” u slučaju da se otvori samo jedan zaslon i ako je više njih otvaraju se sesije zaslona, pokrenite “screen -r .

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

Da biste saznali više o naredbi zaslona i kako je koristiti, samo slijedite vezu: Upotrijebite naredbu zaslona za upravljanje terminalom Linux sesija

Tmux je još jedan softver koji je stvoren kao zamjena za zaslon. Ima većinu mogućnosti zaslona, s nekoliko dodatnih mogućnosti koje ga čine moćnijim od zaslona.

Omogućuje, osim svih opcija koje nudi zaslon, razdvajanje okna vodoravno ili okomito između više prozora, promjenu veličine stakala prozora, praćenje aktivnosti sesije, skriptiranje u načinu naredbenog retka itd. Zahvaljujući ovim značajkama tmuxa, uživa široko prihvaćanje gotovo sve Unix distribucije, pa čak i ona je uključena u osnovni sustav OpenBSD-a.

Nakon što napravite ssh na udaljenom hostu i upišete tmux, ući ćete u novu sesiju s novim prozorom koji se otvara ispred vas, u kojem možete raditi sve što radite na normalnom terminalu.

$ tmux

Nakon izvođenja operacija na terminalu, možete odvojiti tu sesiju od upravljačkog terminala tako da ode u pozadinu i možete se sigurno odjaviti.

Ili možete pokrenuti “tmux detach” na pokretanju tmux sesije ili možete upotrijebiti prečac (Ctrl + b pa d) . Nakon toga vaša će se trenutna sesija odvojiti i vratit ćete se na terminal odakle se možete sigurno odjaviti.

$ tmux detach

Da biste ponovo otvorili sesiju koju ste odvojili i ostavili takvu kakva je kad ste odjavljeni iz sustava, samo se ponovo prijavite na udaljeni stroj i upišite "tmux attach" da biste se ponovo pridružili zatvorenoj sesiji i ona će i dalje biti tamo i pokrenuta .

$ tmux attach

Da biste saznali više o tmuxu i kako ga koristiti, samo slijedite vezu: Upotrijebite Tmux Terminal Multiplexer za upravljanje višestrukim Linux terminalima.

Ako niste toliko upoznati sa zaslonom ili tmuxom, možete upotrijebiti nohup i poslati svoju dugotrajnu naredbu u pozadinu kako biste mogli nastaviti dok se naredba nastavlja izvršavati u pozadini. Nakon toga možete se sigurno odjaviti.

Pomoću naredbe nohup govorimo procesu da ignorira signal SIGHUP koji se ssh sesijom šalje po završetku, čineći tako naredbu trajnom i nakon odjave sa sesije. Prilikom odjave sa sesije naredba se oduzima od upravljanja terminalom i nastavlja raditi u pozadini kao daemon proces.

Evo jednostavnog scenarija u kojem smo pokrenuli naredbu find za traženje datoteka u pozadini na ssh sesiji pomoću nohup-a, nakon čega je zadatak poslan u pozadinu s brzim povratkom koji daje PID i ID posla procesa ([ JOBID] PID) .

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

Kad se ponovo prijavite, možete provjeriti status naredbe, vratiti je u prvi plan pomoću fg% JOBID za praćenje njenog napretka i tako dalje. Ispod, izlaz pokazuje da je posao dovršen jer se ne prikazuje pri ponovnoj prijavi i dao je izlaz koji se prikazuje.

# fg %JOBID

Još jedan elegantan način dopuštanja da se vaša naredba ili jedan zadatak izvrši u pozadini i ostane živ čak i nakon odjave ili prekida veze, pomoću odbacivanja.

Odričete se, uklanja posao sa popisa zadataka procesa u sustavu, tako da je postupak zaštićen od ubijanja tijekom prekida veze, jer ljuska neće primiti SIGHUP kada se odjavite.

Nedostatak ove metode je što bi se trebala koristiti samo za poslove koji ne trebaju nikakav ulaz iz stdina i ne trebaju pisati u stdout, osim ako posebno preusmjerite ulaze i izlaze poslova, jer kada će posao pokušati komunicirati sa stdin ili stdout, zaustavit će se.

Ispod smo poslali naredbu ping u pozadinu tako da ut nastavlja raditi i uklanja se s popisa poslova. Kao što se vidi, posao je prvo obustavljen, nakon čega je i dalje bio na popisu poslova kao ID procesa: 15368.

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

Nakon što je taj signal odricanja poslan na posao i uklonjen je s popisa poslova, iako je i dalje radio u pozadini. Posao bi i dalje bio pokrenut kada biste se ponovo prijavili na udaljeni poslužitelj kao što je prikazano u nastavku.

$ ps -ef | grep ping

Druga korisnost za postizanje potrebnog ponašanja je setid. Nohup ima nedostatak u smislu da procesna grupa procesa ostaje ista, pa je postupak koji se izvodi s nohupom ranjiv na bilo koji signal koji se šalje cijeloj procesnoj grupi (poput Ctrl + C ).

Setids, s druge strane, dodijeljuje novu procesnu grupu procesu koji se izvodi, a samim tim, kreirani proces je potpuno u novo dodijeljenoj procesnoj grupi i može se sigurno izvršiti bez straha da će biti ubijen čak i nakon odjave sa sesije.

Ovdje pokazuje da je postupak ‘sleep 10m’ odvojen od upravljačkog terminala od trenutka kada je stvoren.

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

Kad biste se ponovo prijavili na sesiju, i dalje ćete smatrati da je taj postupak pokrenut.

$ ps -ef | grep [s]leep

Zaključak

Na koje biste sve načine mogli smisliti da vaš proces ostane aktivan i nakon odjave sa SSH sesije? Ako postoji bilo koji drugi i učinkovit način na koji se možete sjetiti, spomenite u svojim komentarima.