Vyhledávání na webu

5 způsobů, jak udržet vzdálené relace a procesy SSH spuštěné po odpojení


SSH nebo Secure Shell zjednodušeně řečeno je způsob, kterým může osoba vzdáleně přistupovat k jinému uživateli na jiném systému, ale pouze v příkazovém řádku, tj. v režimu bez GUI. Technickěji řečeno, když ssh přistoupíme k jinému uživateli na nějakém jiném systému a spustíme příkazy na tomto počítači, ve skutečnosti vytvoří pseudoterminál a připojí ho k přihlašovacímu shellu přihlášeného uživatele.

Když se odhlásíme z relace nebo vyprší časový limit relace poté, co byla delší dobu nečinná, signál SIGHUP se odešle na pseudoterminál a všechny úlohy, které byly na tomto terminálu spuštěny, a to i úlohy, jejichž nadřazené úlohy jsou iniciovány na pseudoterminálu, jsou také odeslány signál SIGHUP a jsou nuceny ukončit.

Nepřehlédněte: 5 užitečných postupů, jak udržet SSH server bezpečný a chráněný

Ukončení relace přežijí pouze úlohy, které byly nakonfigurovány tak, aby tento signál ignorovaly. Na systémech Linux můžeme mít mnoho způsobů, jak tyto úlohy spustit na vzdáleném serveru nebo libovolném počítači i po odhlášení uživatele a ukončení relace.

Pochopte procesy v Linuxu

Normální proces

Normální procesy jsou ty, které mají životnost relace. Spouštějí se během relace jako procesy v popředí a končí v určitém časovém rozpětí nebo když je relace odhlášena. Tyto procesy mají svého vlastníka jako kterýkoli platný uživatel systému, včetně roota.

Osiřelý proces

Osiřelé procesy jsou ty, které měly původně nadřazeného procesu, který vytvořil proces, ale po nějaké době nadřazený proces neúmyslně zemřel nebo selhal, takže se stal rodičem tohoto procesu. Takové procesy mají init jako svého bezprostředního rodiče, který na tyto procesy čeká, dokud nezemřou nebo neskončí.

Proces démona

Jedná se o některé záměrně osiřelé procesy, takové procesy, které jsou záměrně ponechány spuštěné v systému, se nazývají démony nebo záměrně osiřelé procesy. Obvykle se jedná o dlouhotrvající procesy, které jsou jednou spuštěny a poté odpojeny od jakéhokoli řídicího terminálu, takže mohou běžet na pozadí, dokud nejsou dokončeny nebo skončí vyvoláním chyby. Rodič takových procesů úmyslně zemře, takže dítě popraví na pozadí.

Techniky, jak udržet relaci SSH spuštěnou po odpojení

Existují různé způsoby, jak nechat relace ssh spuštěné po odpojení, jak je popsáno níže:

1. Použití příkazu obrazovky k udržení relací SSH v chodu

screen je textový správce oken pro Linux, který umožňuje uživateli spravovat více relací terminálu současně, přepínat mezi relacemi, protokolovat relace pro běžící relace na obrazovce a dokonce relaci kdykoli obnovit. bez obav z odhlášení relace nebo uzavření terminálu.

relace obrazovky lze spustit a poté odpojit od řídicího terminálu a nechat je běžet na pozadí a poté je kdykoli a dokonce na jakémkoli místě obnovit. Stačí spustit relaci na obrazovce a až budete chtít, odpojit ji od pseudoterminálu (nebo řídícího terminálu) a odhlásit se. Až budete mít pocit, můžete se znovu přihlásit a pokračovat v relaci.

Spuštění relace obrazovky

Po zadání příkazu 'screen' budete v nové relaci obrazovky, v rámci této relace můžete vytvářet nová okna, procházet mezi okny, zamykat obrazovku a dělat mnoho dalších věcí, které můžete na normální terminál.

screen

Po zahájení relace obrazovky můžete spustit libovolný příkaz a nechat relaci spuštěnou odpojením relace.

Odpojení obrazovky

Když se chcete odhlásit ze vzdálené relace, ale chcete zachovat relaci, kterou jste vytvořili na tomto počítači, stačí odpojit obrazovku od terminálu, aby na něm nezbyl žádný ovládací terminál. Poté se můžete bezpečně odhlásit.

Chcete-li odpojit obrazovku od vzdáleného terminálu, stačí stisknout “Ctrl+a ” bezprostředně následované “d ” a vrátíte se k terminálu a uvidíte zprávu, že obrazovka je oddělený. Nyní se můžete bezpečně odhlásit a vaše relace zůstane naživu.

Obnovení oddělené relace obrazovky

Pokud chcete obnovit relaci oddělené obrazovky, kterou jste opustili před odhlášením, stačí se znovu přihlásit ke vzdálenému terminálu a zadat “screen -r ” v případě, že je otevřena pouze jedna obrazovka a pokud je více relace obrazovky se otevírají spuštěním “screen -r .

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

Chcete-li se dozvědět více o příkazu obrazovky a jak jej používat, stačí kliknout na odkaz: Použití příkazu obrazovky ke správě relací terminálu Linux

2. Použití Tmux (Terminal Multiplexer) k udržení SSH relací v chodu

Tmux je další software, který je vytvořen jako náhrada za obrazovku. Má většinu funkcí obrazovky, s několika dalšími funkcemi, díky kterým je výkonnější než obrazovka.

Umožňuje, kromě všech možností, které nabízí obrazovka, rozdělení panelů vodorovně nebo svisle mezi více oken, změnu velikosti okenních panelů, sledování aktivity relace, skriptování pomocí režimu příkazového řádku atd. Díky těmto funkcím tmux se těší širokému přijetí téměř všechny unixové distribuce a dokonce i to bylo zahrnuto do základního systému OpenBSD.

Spusťte relaci Tmux

Po provedení ssh na vzdáleném hostiteli a zadání tmux vstoupíte do nové relace s novým oknem, které se před vámi otevře, ve kterém můžete dělat cokoli, co děláte na normálním terminálu.

tmux

Po provedení vašich operací na terminálu můžete tuto relaci odpojit od řídicího terminálu, aby přešla na pozadí a vy se můžete bezpečně odhlásit.

Odpojte relaci Tmux od terminálu

Buď můžete při spuštění relace tmux spustit “tmux unlock ”, nebo můžete použít zkratku (Ctrl+b pak d). Poté bude vaše aktuální relace odpojena a vrátíte se zpět na svůj terminál, odkud se můžete bezpečně odhlásit.

tmux detach

Obnovení uzavřené relace Tmux

Chcete-li znovu otevřít relaci, kterou jste odpojili a nechali tak, jak je, když jste se odhlásili ze systému, stačí se znovu přihlásit ke vzdálenému počítači a zadat “tmux připojit ” pro opětovné připojení k uzavřené relaci. bude stále tam a běží.

tmux attach

Chcete-li se dozvědět více o tmux a jak jej používat, stačí kliknout na odkaz: Použijte Tmux Terminal Multiplexer ke správě více linuxových terminálů.

3. Použití příkazu nohup k udržení relací SSH

Pokud nejste tak obeznámeni s screen nebo tmux, můžete použít nohup a odeslat svůj dlouhý příkaz na pozadí, abyste mohli pokračovat příkaz se bude nadále provádět na pozadí. Poté se můžete bezpečně odhlásit.

Příkazem nohup říkáme procesu, aby ignoroval signál SIGHUP, který odešle ssh relace při ukončení, takže příkaz přetrvává i po odhlášení relace. Při odhlášení relace je příkaz odstraněn z řídicího terminálu a běží na pozadí jako proces démona.

Provedení příkazu pomocí nohup na pozadí

Zde je jednoduchý scénář, ve kterém jsme spustili příkaz find k vyhledání souborů na pozadí v relaci ssh pomocí nohyp, načež byla úloha odeslána na pozadí s okamžitým návratem PID a úlohou ID procesu ([JOBID] PID).

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

Obnovení relace pro zobrazení, zda úloha stále běží

Když se znovu přihlásíte, můžete zkontrolovat stav příkazu, vrátit jej zpět do popředí pomocí 'fg %JOBID' a sledovat jeho průběh a tak dále. Níže výstup ukazuje, že úloha byla dokončena, protože se nezobrazuje při opětovném přihlášení, a poskytl výstup, který je zobrazen.

fg %JOBID

4. Použití příkazu disown k udržení relací SSH v chodu

Dalším elegantním způsobem, jak nechat svůj příkaz nebo jednu úlohu běžet na pozadí a zůstat naživu i po odhlášení nebo odpojení relace, je použití disown.

Zakázat, odebere úlohu ze seznamu úloh procesu v systému, takže proces je chráněn před zabitím během odpojení relace, protože shell neobdrží SIGHUP, když odhlásíte se.

Nevýhoda této metody spočívá v tom, že by se měla používat pouze pro úlohy, které nepotřebují žádný vstup z stdin a ani nepotřebují zapisovat do stdout, pokud výslovně nepřesměrujete vstup a výstup úloh, protože když se úloha pokusí o interakci s stdin nebo stdout, zastaví se.

Provádění příkazu pomocí disown na pozadí

Níže jsme odeslali příkaz ping na pozadí, aby ut stále běžel a byl odstraněn ze seznamu úloh. Jak je vidět, úloha byla nejprve pozastavena, poté byla stále v seznamu úloh jako ID procesu: 15368.

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

Poté byl do úlohy předán signál odmítnutí a ta byla odstraněna ze seznamu úloh, ačkoli stále běžela na pozadí. Úloha bude stále spuštěna, když se znovu přihlásíte ke vzdálenému serveru, jak je vidět níže.

ps -ef | grep ping

5. Použití příkazu setsid ke spuštění relací SSH

Další nástroj pro dosažení požadovaného chování je setsid. Nohup má nevýhodu v tom smyslu, že procesní skupina procesu zůstává stejná, takže proces běžící s nohup je zranitelný vůči jakémukoli signálu odeslanému do celé skupiny procesů (jako Ctrl + C).

setsid na druhé straně přiděluje novou skupinu procesů právě prováděnému procesu, a proto je vytvořený proces zcela v nově přidělené skupině procesů a může se bezpečně provádět bez obav, že bude zabit i po odhlášení z relace.

Proveďte libovolný příkaz pomocí setsid

Zde ukazuje, že proces ‘sleep 10m’ byl od okamžiku vytvoření odpojen od řídicího terminálu.

setsid sleep 10m
ps -ef | grep sleep

Nyní, když se znovu přihlásíte do relace, bude tento proces stále spuštěn.

ps -ef | grep [s]leep

Závěr

Jaké způsoby byste mohli vymyslet, jak udržet váš proces v chodu i po odhlášení z relace SSH? Pokud vás napadá nějaký jiný a účinný způsob, zmiňte se ve svých komentářích.