Vraag Hoe kunnen processen worden uitgevoerd na het beëindigen van ssh-sessie?


Laten we zeggen dat ik een heleboel processen start vanuit een ssh-sessie. Is het mogelijk om de SSH-sessie te beëindigen terwijl deze processen op de externe computer worden uitgevoerd?


506
2017-10-21 12:09


oorsprong


Verwant: unix.stackexchange.com/questions/4004/... - Anton Tarasenko


antwoorden:


Je moet op zoek naar moderne alternatieven zoals tmux.

tmux is superieur aan screen om verschillende redenen zijn hier slechts enkele voorbeelden:

  • Windows kan worden verplaatst tussen sessies en zelfs worden gekoppeld aan meerdere sessies
  • Windows kan horizontaal en verticaal in vensters worden gesplitst
  • Ondersteuning voor UTF-8 en 256 kleurenterminals
  • Sessies kunnen vanuit de shell worden beheerd zonder dat u een sessie hoeft in te voeren

Basisfunctionaliteit

Om dezelfde functionaliteit te krijgen als uitgelegd in de antwoord bevelen screen, zou u het volgende moeten doen:

  • ssh in de externe machine
  • begin tmux door te typen tmux in de schaal
  • start het gewenste proces in het begin tmux sessie
  • verlaat / ontkoppel de tmux sessie door te typen Ctrl+b en dan d 

U kunt zich nu veilig afmelden van de externe machine, uw proces blijft binnen draaien tmux. Wanneer u weer terugkomt en de status van uw proces wilt controleren, kunt u dit gebruiken tmux attach om aan je te hechten tmux sessie.

Als u meerdere sessies naast elkaar wilt hebben, moet u elke sessie een naam geven Ctrl+b en $. U kunt een lijst van de lopende sessies krijgen met behulp van tmux list-sessions, nu hechten aan een lopende sessie met opdracht tmux attach-session -t 0.

tmux kan veel geavanceerdere dingen doen dan één enkel venster in één sessie verwerken. Voor meer informatie kijk eens man tmux of de tmux GitHub-pagina. Met name, hier is een veelgestelde vraag over de belangrijkste verschillen tussen screen en tmux.


594
2017-11-23 09:26



@CraigM-gebruik screen -x -r [screenname] of screen -rx Kortom als je maar één schermsessie actief hebt. Hiermee kunt u een bestaande scherminstantie koppelen. - Lekensteyn
Dit advies heeft me geholpen met hetzelfde probleem, maar ik denk dat het een typfout bevat. Ik ben er vrij zeker van dat je moet typen Ctrl-b en dan d om het te verlaten / los te maken tmux sessie. Zeker dat is het geval voor de versie van tmux op mijn Ubuntu 12.04. - cxrodgers
Ik heb een fout gemaakt tijdens het volgen van de bovenstaande instructies. Ik zal het delen als iemand in dezelfde fout kan vervallen: ik startte tmux in de shell van mijn eigen computer in plaats van de shell van de externe computer. Men moet tmux starten in de shell van een externe computer. - Mert Nuhoglu
Scherm wordt nu opnieuw ontwikkeld: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Zou je je antwoord kunnen bijwerken? - muru
Als alternatief, ren tmux detach in plaats van te typen ctrl-b d - Andrew MacFie


De beste manier is vaak de eenvoudigste.

nohup long-running-command &

Het is speciaal hiervoor gemaakt, het logt zelfs stdout naar nohup.log

man nohup

Als je sommige reeds draaiende taken wilt "achtergronderen", dan is je beste gok om ctrl + z te gebruiken en dan uit te voeren

bg (dit zal de achtergrond zijn van uw meest recente opgeschorte taak, waardoor deze kan blijven werken)

dan een snel disown moet het proces uitvoeren nadat u bent uitgelogd.

screen en anderen kunnen het, maar dat is niet waar ze voor zijn. ik raad aan nohup voor taken waarvan je weet dat je ze achterlaat en bg voor taken die je al hebt en die niet opnieuw willen starten.

Houd in gedachten, beide zijn bash specifiek. Als je bash niet gebruikt, kunnen de commando's anders zijn.


217
2017-11-28 02:58



Ik zou aanraden om te doen disown -h - Michele
interessant scherm en tmux werkt niet voor mijnwerker, maar nee werkt - Yasin Okumuş
bg + disown werkte niet voor mij. Ik had een implementatiescript dat ik ben vergeten om binnen tmux te starten en ik moest vroeg vertrekken voor een vergadering. Het script voert continu de voortgang naar de shell uit. ctrl+z stopte het proces en bracht me terug naar bash. bg hervatte het proces, maar het ging ook verder met het uitvoeren van de status naar bash, waardoor het onmogelijk was om te zien wat ik aan het typen was. Echter, een disown commando produceerde "disown: current: no such job" - BrianHVB


Je zou dat kunnen doen door te gebruiken screen.

Type man screen om meer te weten te komen of om dit te lezen scherm man pagina.

Eenvoudig scenario:

  • ssh in uw remote box. Type screen Start vervolgens het gewenste proces.

  • druk op Ctrl-EEN dan Ctrl-D. Hierdoor wordt uw schermsessie "losgemaakt" maar blijven uw processen actief. U kunt nu uitloggen van het externe vak.

  • Als u later nog eens terug wilt komen, meldt u zich opnieuw aan en typt u screen -r Hierdoor wordt uw schermsessie "hervat" en kunt u de uitvoer van uw proces bekijken.


179
2017-10-21 12:20



Ik noem mijn schermsessies meestal met behulp van screen -S name om het later gemakkelijker te maken om verbinding te maken met de juiste. - David Oneill
De link is verbroken - Gab是好人
Persoonlijk werk ik aan een doos zonder pakketbesturingssoftware. Nadat ik ongeveer een half uur bezig was met het bouwen van afhankelijkheden voor TMUX (waar ik persoonlijk ervaring mee heb en leuk vind) van de bron, werd het duidelijk dat het scherm voor mij de betere en eenvoudigere oplossing was. TL; DR: de optimale oplossing voor dit probleem hangt af van de gebruikscasus, de machine en hoeveel tijd je moet instellen. Bedankt voor dit antwoord :) - Max von Hippel
Combinatie met screen -S voor vertrek en screen -r wanneer je terugkomt is geweldig! - Meloman
Bedankt hiervoor. Deze oplossing werkte voor me terwijl tmux dat niet deed (ik gebruik een versie van bash voor windows terwijl ik in een linux-machine schuif) - Michael Sorensen


Scherm en nohup is de betere manier, maar als u een proces dat al draait zonder scherm of nohup moet loskoppelen, kunt u de opdracht disown uitvoeren.

disown [-ar] [-h] [jobspec… |pid… ]

Zonder opties, verwijder elk jobspec uit de tabel met actieve vacatures. Als het -h optie wordt gegeven, de taak wordt niet uit de tabel verwijderd, maar is gemarkeerd zodat SIGHUP niet naar de taak wordt verzonden als de shell een SIGHUP ontvangt. Als jobspec is niet aanwezig, en ook niet de -a noch de -r optie is opgegeven, de huidige taak wordt gebruikt. Als Nee jobspec wordt geleverd, de -a optie betekent om alle taken te verwijderen of te markeren; de -r optie zonder een jobspec argument beperkt de bewerking tot lopende taken.

Met disown kun je de terminal sluiten en het proces op de machine laten lopen.


72
2017-10-21 13:19



Dit is ook mijn favoriete manier om het te doen. Ik gebruik vaak disown -a && exit - Stefano Palazzo♦
Perfect. Dit is een mooie opdracht en verdient alle upvotes! - Greg
een woord van waarschuwing, ik stopte een lopend proces met Ctrl-Z en startte het niet op de achtergrond voordat ik het opbelde disown en het heeft het gedood. - HDave
Kan vastlopen als het naar de terminal wil schrijven. Het omleiden van de uitvoer van een lopend proces is niet zo eenvoudig. Beter om het goed te starten met nohup. - jiggunjer
Dit is een goed antwoord, omdat het de vraag direct beantwoordt. De auteur van de vraag vroeg wat hij moest doen na al een aantal langlopende opdrachten uitgevoerd hebben. De meeste van deze antwoorden laten u weten wat u moet doen voor je voert de commando's uit. - q0rban


Ik zat vast in een grote mv, dus ik was niet in een positie om het proces te stoppen, het instellingenscherm te starten en het dan opnieuw te starten. Ik slaagde erin om de ssh-sessie met het proces af te sluiten door in wezen de volgende stappen te volgen:

  1. ssh [server]
  2. opdracht
  3. CTRL + Z
  4. bg
  5. verloochenen
  6. Uitgang

Stap 3 pauzeert het huidige proces (bijvoorbeeld mijn 'mv'-opdracht). Stap 4 zet het gepauzeerde proces op de achtergrond en hervat het. Stap 5 laat je het proces verwerpen.


37
2017-11-25 03:30



Ingebouwde zijn altijd mijn eerste keuze :) THX - ken_oy
Dit antwoord moet als juist worden gemarkeerd. Om te installeren en gewend te raken aan het scherm voor het oplossen van dit probleem is overdreven. - Ulrich-Lorenz Schlüter
Dit is erg handig wanneer u al een opdracht hebt gestart en die al lang wordt uitgevoerd. Het afsluiten en starten in een TMUX-sessie kost tijd - Deepali Mittal


Er zijn twee belangrijke programma's die u kunt gebruiken om programma's en terminalstatus te behouden via meerdere ssh-verbindingen. Ze zijn scherm (de zittende, maar helaas niet onderhouden) wordt nu actief ontwikkeld) en tmux (nieuwer, actief onderhouden). Byobu is een front-end die boven op deze systemen kan worden uitgevoerd en aanvullende ubuntu-statusinformatie kan bieden. Op nieuwe installaties zal het tmux als een backend gebruiken, als je een oudere installatie van byobu hebt en een bestaande config zal het de vorige backend behouden, zij het scherm of tmux.

byobu

Byobu kan op de computer worden geïnstalleerd door dit te doen op een Debian-computer:

sudo aptitude install byobu

Met yum, doe je dat

su -c 'yum install byobu'

Het is ook mogelijk om byobu op andere distributies te installeren.

Gebruik van byobu

Je kunt beginnen door te gaan door te rennen byobu op de hostcomputer na verbinding met ssh. Dit geeft je een shell die er zo uitziet:

image-byobu

Je kunt Byobu Terminal ook gebruiken op een Ubuntu-machine met -X-optie en eenvoudig perfect werken.

Gebruik:

Begin door te typen door te typen byobu.

U kunt op F2 drukken om een ​​nieuw venster te maken binnen de huidige sessie, F3-F4 om tussen de verschillende vensters te schakelen.

Het beste deel van byobu is dat je de processen in de terminal niet hoeft te doden om de terminal te verlaten. Je kunt simpelweg screen / tmux (het skelet van byobu) naar de achtergrond sturen en de volgende keer dat je komt verder gaan:

  • Om te verlaten doorobu en te laten lopen (ontkoppel) drukt u op F6.
  • De volgende keer dat je komt, doe het gewoon byobu en je zult terug komen waar je was.

    byobu-detach-attach

Je kunt ook verschillende byobu-sessies maken per byobu -S session1 enzovoort. En je kunt verbinding maken met een van beide wanneer je terugkomt.

Je kunt veel meer doen met Byobu. Gebruik het! Sommige definitieve gidsen zijn hier, hier of hier.


19
2017-11-24 22:09



Ik probeerde byobu van een op PuTTY gebaseerde sessie naar mijn Ubuntu-box, maar ik krijg de statusregel herhaald en scrol op het scherm. Hoewel het goed losgemaakt was, drukte ik op F6 en het was geen bruikbare oplossing in mijn setup. - jfmessier
@jfmessier Het komt omdat PuTTY geen ncurses (utf-8 in principe) goed maakt. Het is mogelijk om dit probleem te elimineren door deze thread te volgen - stackoverflow.com/questions/10731099/... - SiddharthaRT
Dit is geweldig! 1. het geeft me een gekleurde bash-prompt die ik met bash niet kan inschakelen als mijn standaard shell en 2. ik mag tegelijkertijd 2 bots uitvoeren en nog steeds heb een andere terminal om aan te werken! @SiddharthaRT je verdient een upvote meneer! - Dev


Je kunt dit niet doen als het proces eenmaal is gestart, je moet dingen hebben ingesteld voordat je een langlopende taak uitvoert.

Je kunt gebruiken nohup maar moderne wijsheid suggereert dat je scherm of byobu gebruikt als je inlogt, zodat je dingen los kunt laten en alles kunt laten lopen.

Het scherm heeft het voordeel dat u kunt loskoppelen van de ene machine en opnieuw kunt aansluiten op een andere, wat handig is als u wilt controleren op langlopende processen die na het einde van de werkdag voorbij zijn.

Er kan redelijk worden begonnen gids voor scherm hier.

byobu zet een eenvoudig te gebruiken interface op het scherm met menu's enz. Het is ook de huidige implementatie van het scherm op nieuwere ubuntu. F2 om een ​​nieuwe terminal F3 / F4 te starten om heen en weer te schakelen en F6 om de verbinding te verbreken. Typ exit om terminals daadwerkelijk te beëindigen.


16
2017-10-21 12:16



byobu gebruikt tegenwoordig tmux .. - scottl
"Je kunt dit niet doen als het proces eenmaal is begonnen, je moet dingen hebben voorbereid voordat je een langlopende baan hebt." - Nee, je kunt gebruiken disown om dit te behalen. Zie @ bassgey's antwoord - Rich
na worstelen om het scherm te leren en tmux .... byobu bracht tranen in mijn ogen - HDave
disown en indien nodig gewoon Ctrl-z, dan bg om het te krijgen van de actieve terminal en naar de achtergrond. Dan, disown. - mimoralea


Hé, terwijl ik het erover eens was dat scherm de meest effectieve optie is. U kunt vncserver gebruiken en het proces daarop starten.

Ook als het enige wat je hoeft te doen is om het proces te laten draaien en niet de controle over te nemen, en het allerbelangrijkst was je niet bewust dat je de sessie moet sluiten en je hebt het proces al aan de gang, je hebt geen geluk als je gebruikte bash als de schaal

Eerst moet je het proces naar de achtergrond sturen door Ctrl + Z in te typen, gevolgd door bg% 1 (het aantal hangt af van het jobnummer, meestal is het 1, maar je kunt de lijst eenvoudig uit de opdrachtjobs halen)

Roep ten slotte het commando disown aan (gevolgd door de jobid ... same als met bg command)

Hiermee wordt de ouder-kindrelatie tussen je shell en het proces op de achtergrond verwijderd, waardoor wordt voorkomen dat deze sterft als je shell wordt beëindigd.


7
2018-06-06 21:29



Dit antwoord is de beste! Waarom heeft iedereen het over screen, de vraag was post-inloggebeurtenis, hoe de processen draaiend te houden, nu na het inloggen maar vooraleer ze te starten. Geweldig antwoord Jorge, je hebt me echt geholpen! :) - jwbensley
eenvoudigweg bg (zonder %1) is vaak genoeg, omdat de standaard de huidige taak is - Walter Tross
Het zou leuk zijn om een ​​uitgebreid antwoord te hebben: A priori (van tevoren instellen): ascii terminal-scherm (oud), tmux (nieuwer); X windows: vnc (oud, nog steeds onderhouden), xpra (nieuwer), waarbij xpra rootloos is. Een achterste (aanhoudend nadat je bent begonnen): ^ Z, verwees, ... Maar ik ben te lui om er meer mee te leven dan dit. - Krazy Glew


Voor een enkel shellscript dat ik gedurende een lange periode heb uitgevoerd, log ik in en voer ik het proces op de achtergrond uit met '&'.

Voorbeeld:

/path/to/my/script &

Ik heb me afgemeld en mijn SSH-sessie verbroken. Wanneer ik me later aanmeld, wordt het script nog steeds uitgevoerd, zoals blijkt uit de voortdurende gegevensverzameling uit het script.


7
2017-07-29 14:58



Ja, ik zou graag willen weten hoe het scherm / tmux beter is dan deze eenvoudige oplossing. - Mads Skjern
Ja, ik kan dit ook op mijn ubuntu zien, maar het zou niet in theorie moeten gebeuren. Ik begrijp niet waarom - Daniel Pinyol
@MadsSkjern Omdat u met deze methode geen invoer in het script kunt invoeren. - Ken Sharp
@MadsSkjern de reden is dat als je processen als deze uitvoert met & als u zich afmeldt bij uw SSH-sessie, zal het proces nog steeds zijn lopend u kunt het echter niet zien uitgangvan dat proces (als je script iets echode, zul je het niet zien, maar als het een bestand schrijft, zal het bestand daar zijn) - DarkCygnus


Je moet uitchecken GNU-scherm en kijk of het je helpt. Afhankelijk van hoe je je applicatie nodig hebt om in realtime uit te voeren, kan dit meer problemen veroorzaken dan het oplost, maar het zal je in ieder geval in staat stellen om je sessie te hervatten alsof je hem nooit hebt verlaten.

Hoe te gebruiken :

  • Gebruik de opdracht screen voor de eerste start, blader je door de introductie-berichten, je zou een terminal moeten krijgen.
  • C-a C-c opent een andere terminal
  • C-a C-k doodt een terminal
  • U kunt C-a C-Space en C-a C-Backspace gebruiken om door terminals te fietsen
  • C-a C-a is handig als je meestal maar twee terminals gebruikt
  • C-a C-d maakt de huidige schermsessie los en sluit schermen af. Je kunt dan gebruiken screen -r om die sessie te hervatten. U kunt in één keer meerdere losstaande schermsessies hebben, in dit geval wordt een lijst met beschikbare sessies weergegeven.

Er zijn veel andere opties, bijvoorbeeld gesplitste schermen, en ook alle sneltoetsen kunnen volledig worden aangepast.


3
2018-05-22 15:31





Eenvoudigste antwoord ...

ctrl + z zal het lopende programma opschorten

"bg" zal het op de achtergrond uitvoeren


2
2017-08-13 00:28



Zonder het proces te verloochenen (met zoiets als disown of nohup), zal dit proces meestal niet worden uitgevoerd na het einde van de SSH-sessie. - Eliah Kagan
Op mijn Ubuntu-server, met standaardinstellingen, blijft het echt draaien! - Mads Skjern