Vraag Wordt uw verbinding met programma's onderbroken als u de verbinding met een SSH-sessie verliest?


Dus, stel dat ik ontkoppeld word van een SSH-sessie nadat ik begonnen ben rsync of cp of een andere opdracht die lang kan duren. Loopt die opdracht gewoon door totdat hij klaar is nadat ik de verbinding heb verbroken of wordt hij gewoon gedood?

Altijd dit afgevraagd.


75
2018-01-06 03:09


oorsprong


Ik wil alleen toevoegen aan wat hierboven is gezegd, als je merkt dat je in een situatie bent waarin je een reeds draaiend proces in screen, proberen reptyr. - a sad dude


antwoorden:


Bewerken voor 2016:

Deze Q & A is ouder dan de systemd v230 debacle. Vanaf systemd v230 is de nieuwe standaard het doden van alle kinderen van een beëindigende inlogsessie, ongeacht welke historisch geldige voorzorgsmaatregelen werden genomen om dit te voorkomen. Het gedrag kan worden veranderd door in te stellen KillUserProcesses=no in /etc/systemd/logind.conf, of omzeild met behulp van de systemd-specifieke mechanismen voor het starten van een daemon in gebruikersruimte. Die mechanismen vallen buiten de reikwijdte van deze vraag.

De onderstaande tekst beschrijft hoe dingen traditioneel langer in UNIX-ontwerpruimte hebben gewerkt dan Linux heeft bestaan.


Ze worden gedood, maar niet per se meteen. Het hangt er vanaf hoe lang het duurt voordat de SSH-daemon heeft besloten dat je verbinding dood is. Wat volgt is een langere uitleg die u zal helpen begrijpen hoe het eigenlijk werkt.

Toen u zich aanmeldde, heeft de SSH-daemon een pseudo-terminal voor u toegewezen en deze gekoppeld aan de geconfigureerde loginshell van uw gebruiker. Dit wordt de controleterminal genoemd. Elk programma dat u normaal op dat moment start, ongeacht het aantal lagen diep in de schaal, zal uiteindelijk zijn voorouders terugvoeren naar die schaal. Je kunt dit observeren met de pstree commando.

Wanneer het SSH-daemonproces dat aan uw verbinding is gekoppeld, beslist dat uw verbinding dood is, stuurt het een ophangsignaal (SIGHUP) naar de login-shell. Dit geeft de shell aan dat je bent verdwenen en dat deze na zichzelf moet gaan opruimen. Wat er op dit punt gebeurt is shell-specifiek (zoek de documentatiepagina voor "HUP"), maar voor het grootste deel zal het beginnen met verzenden SIGHUP naar lopende taken die eraan verbonden zijn voordat deze wordt beëindigd. Elk van die processen zal op zijn beurt doen wat ze geconfigureerd zijn om te doen bij ontvangst van dat signaal. Meestal betekent dat eindigen. Als die banen een eigen baan hebben, zal het signaal vaak ook worden doorgegeven.

De processen die een ophanging van de controlerende terminal overleefd zijn, hebben zich losgemaakt van het hebben van een terminal (daemonprocessen die je binnenin hebt gestart), of degenen die werden aangeroepen met een voorafgegaan nohup commando. (d.w.z. "hang hier niet aan op") Daemons interpreteren het HUP-signaal anders; omdat ze geen controlerende terminal hebben en niet automatisch een HUP-signaal ontvangen, wordt deze in plaats daarvan opnieuw gebruikt als een handmatig verzoek van de beheerder om de configuratie opnieuw te laden. Ironisch genoeg betekent dit dat de meeste admins het "hangup" gebruik van dit signaal voor niet-daemons pas veel, veel later leren. Dat is waarom je dit leest!

Terminalmultiplexers zijn een veel voorkomende manier om uw shell-omgeving intact te houden tussen verbroken verbindingen. Hiermee kunt u zich losmaken van uw shell-processen op een manier die u later weer aan hen kunt koppelen, ongeacht of die ontkoppeling toevallig of opzettelijk was. tmuxen screen zijn de meer populaire; syntaxis voor het gebruik ervan valt buiten het bestek van uw vraag, maar het is de moeite waard om naar te kijken.


Er is gevraagd om uit te leggen hoe lang het duurt voordat de SSH-daemon heeft besloten dat je verbinding dood is. Dit is een gedrag dat specifiek is voor elke implementatie van een SSH-daemon, maar u kunt ervan op aan dat ze allemaal worden beëindigd wanneer een van beide zijden de TCP-verbinding opnieuw instelt. Dit zal snel gebeuren als de server probeert naar de socket te schrijven en de TCP-pakketten niet worden bevestigd, of langzaam als niets probeert om naar de PTY te schrijven.

In deze specifieke context zijn de factoren die het waarschijnlijkst zijn om een ​​schrijfactie te activeren,:

  • Een proces (meestal het programma op de voorgrond) dat probeert te schrijven naar de PTY aan de serverzijde. (Server-> client)
  • De gebruiker die probeert te schrijven naar de PTY aan de clientzijde. (Client-> server)
  • Keepalives van welke soort dan ook. Deze zijn meestal niet standaard ingeschakeld, hetzij door de client of de server, en er zijn meestal twee smaken: toepassingsniveau en op TCP gebaseerde (d.w.z. SO_KEEPALIVE). Keepalives komen erop neer dat de server of de client niet vaak pakketten naar de andere kant verzendt, zelfs als niets anders een reden zou hebben om naar de socket te schrijven. Hoewel dit meestal bedoeld is om firewalls te omzeilen, worden verbindingen te snel verbroken, maar dit heeft als bijkomend effect dat de afzender merkt wanneer de andere kant niet veel sneller reageert.

De gebruikelijke regels voor TCP-sessies zijn hier van toepassing: als er een onderbreking is in de connectiviteit tussen de client en de server, maar geen van beide partijen probeert een pakket te verzenden tijdens het probleem, zal de verbinding overleven, op voorwaarde dat beide partijen achteraf reageren en het verwachte TCP ontvangen volgnummers.

Als één partij heeft besloten dat de socket dood is, zijn de effecten meestal onmiddellijk: het sshd-proces wordt verzonden HUP en zichzelf beëindigen (zoals eerder beschreven), of de client zal de gebruiker op de hoogte stellen van het gedetecteerde probleem. Het is de moeite waard om op te merken dat alleen omdat de ene partij denkt dat de andere dood is, niet betekent dat de andere is op de hoogte gebracht. De verweesde kant van de verbinding blijft meestal open totdat ofwel ernaar wordt geprobeerd te schrijven en deze wordt onderbroken, of ontvangt een TCP-reset van de andere kant. (als connectiviteit op dat moment beschikbaar was) De opruiming die in dit antwoord wordt beschreven, gebeurt alleen na de server heeft gemerkt.


108
2018-01-06 04:36



Ik zou ook de opdracht 'dtach' aan die lijst toevoegen - het is een beetje het tegenovergestelde van scherm / tmux omdat je meerdere terminals aan één sessie kunt koppelen en het ook geweldig is om een ​​sessie te verlengen, hoewel het niet alle middelen bieden om de recente geschiedenis opnieuw te spelen. - fluffy
dtach url is hier: dtach.sourceforge.net - slm
uitstekende uitleg. Ik voel me al meer linuxey! - fregas
En hoewel het technisch gezien geen deel uitmaakt van je antwoord, is hier een interessant stukje trivia: je kunt het gebruiken kill -HUP als root om iemands terminal te dwingen op te hangen. Je zou dit niet zonder goede reden moeten doen. Ik haal het grootste deel van mijn kilometers eruit als gebruikers shells achterlaten tijdens onderhoud en ik moet een bestandssysteem ontkoppelen dat hun shell openhoudt. Als de gebruiker is verbonden maar niet-actief, verzendt u het signaal naar hun sshd-proces. Anders, als het in een terminalmultiplexer wordt uitgevoerd, stuur het dan naar de shell die je wilt stoppen. Hang de schaal alleen op zodat je niet kunt werken! - Andrew B
@AndrewB, kun je alsjeblieft uitleggen hoe "het SSH daemonproces ... beslist dat je verbinding dood is"? En hoe kan ik weten of de SSH-daemon denkt / weet dat de (welke) verbinding dood is of niet? - Xiao Peng - ZenUML.com


Zoals anderen hebben gezegd, als je de verbinding met ssh verbreekt, is alles wat erin staat verdwenen.

Zoals @Michael Hampton en anderen hebben gezegd dat je tools zoals kunt gebruiken tmux of screen ontkoppelen / opnieuw verbinden met terminals zonder de inhoud te verliezen (dat wil zeggen onderliggende processen).

Daarnaast kun je een proces met een en-teken op de achtergrond zetten & en gebruik vervolgens het commando disown om ze te disassociëren met de huidige shell.

# start a command
% sleep 5000 &
[1] 3820

# check it
% jobs
[1]+  Running                 sleep 5000 &

# disown everything
% disown -a

# check it again (gone from shell)
% jobs
%

# but it's still running on the system
% ps -eaf|grep "[s]leep"
saml      3820 23791  0 00:16 pts/1    00:00:00 sleep 5000
%

21
2018-01-06 05:27



Is het mogelijk om een ​​terminalsessie weer te koppelen aan een disowned proces? - Fake Name
Ja. Zie deze U / L-vraag voor meer informatie: unix.stackexchange.com/questions/4034/... - slm


Nee, alle programma's die nog op de terminal zijn aangesloten en die niet op de achtergrond worden geplaatst met iets als nohup, zou worden gedood.

Daarom zijn er virtuele terminaloplossingen zoals tmux en de oudere screen die sessies maken die blijven werken, zelfs als u de verbinding hebt verbroken en waarnaar u later opnieuw kunt koppelen.


11
2018-01-06 03:16