Vraag Een Linux-proces laten lopen nadat ik me heb afgemeld


Ik maak verbinding met een Linux-machine via SSH en ik probeer een zwaar bash-script uit te voeren dat bestandssysteembewerkingen uitvoert. Er wordt verwacht dat het uren blijft draaien, maar ik kan de SSH-sessie niet open laten vanwege problemen met internetverbindingen die ik heb.

Ik betwijfel of het uitvoeren van het script met de achtergrondoperator, het ampersand (&), zal het lukken, omdat ik het heb geprobeerd en later ontdekte dat het proces niet was voltooid. Hoe kan ik uitloggen en het proces draaiende houden?


139
2017-09-15 06:00


oorsprong




antwoorden:


De beste methode is om het proces in een terminalmultiplexer te starten. Als alternatief kunt u ervoor zorgen dat het proces het HUP-signaal niet ontvangt.


EEN terminal multiplexer biedt "virtuele" terminals die onafhankelijk van de "echte" terminal werken (eigenlijk zijn alle terminals van vandaag "virtueel" maar dat is een ander onderwerp voor een andere dag). De virtuele terminal blijft draaien, zelfs als je echte terminal wordt afgesloten met je SSH-sessie.

Alle processen gestart vanuit de virtuele terminal zullen blijven draaien met die virtuele terminal. Wanneer u opnieuw verbinding maakt met de server, kunt u opnieuw verbinding maken met de virtuele terminal en alles zal zijn alsof er niets is gebeurd, behalve de tijd die verstreken is.

Twee populaire eindmultiplexers zijn scherm en tmux.

Scherm heeft een steile leercurve. Hier is een goede tutorial met diagrammen die het concept uitleggen: http://www.ibm.com/developerworks/aix/library/au-gnu_screen/


De HUP signaal (of SIGHUP) wordt door de terminal naar al zijn kindprocessen verzonden wanneer de terminal gesloten is. De algemene actie bij het ontvangen van SIGHUP is om te beëindigen. Dus wanneer uw SSH-sessie wordt verbroken, worden al uw processen beëindigd. Om dit te voorkomen, kunt u ervoor zorgen dat uw processen SIGHUP niet ontvangen.

Twee eenvoudige methoden om dit te doen zijn nohup en disown.

Voor meer informatie over hoe nohup en disown werkt lees deze vraag en antwoord: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

Opmerking: hoewel de processen actief blijven, kunt u niet langer met ze communiceren omdat ze niet langer aan een terminal zijn gekoppeld. Deze methode is vooral handig voor langlopende batchprocessen die, eenmaal gestart, geen gebruikersinvoer meer nodig hebben.


132
2017-09-15 06:05



Ik vind dit antwoord leuk omdat het een oplossing biedt voor zowel interactieve als niet-interactieve situaties. In de interactieve case, screen geeft je veel meer opties, maar als je gebruikt authorized_keys om mensen een script op afstand via te laten uitvoeren ssh, de nohup optie is een mooie eenvoudige manier voor het script om processen te starten die langer duren dan de ssh sessie gebruikt om ze te starten. - Mark Booth
@rahmanisback - Onthoud dat je je geaccepteerde antwoord op elk moment kunt wijzigen. Alleen omdat het antwoord van EricA tot nu toe de hoogste is, betekent nog niet dat dit het beste antwoord voor u is. Als u het antwoord inderdaad aanvaardt, moedigt u misschien meer mensen aan om het als een goed antwoord te stemmen. - Mark Booth
* Kuch * tmuxisbetter * kuch * - crasic
tmux > scherm. Probeer het, je zult nooit meer teruggaan. - h0tw1r3
@TheLQ - byobu is GNU-scherm. U gebruikt nog steeds het scherm, alleen met een zeer aangepaste .screenrc. - EEAA


Er zijn een paar manieren om dit te doen, maar degene die ik het handigst vind, is om te gebruiken GNU-scherm.

Nadat je gesmecht hebt, ren screen. Hiermee start een andere shell die binnen het scherm wordt uitgevoerd. Voer je commando uit en doe dan a Ctrl-een  d.

Hiermee wordt de verbinding met de schermsessie verbroken. Op dit moment kunt u uitloggen of iets anders doen dat u wilt.

Wanneer u opnieuw verbinding wilt maken met de schermsessie, voert u gewoon uit screen -RD van de shell-prompt (als dezelfde gebruiker die de sessie heeft gemaakt).


92
2017-09-15 06:07



Geweldig! Nette antwoord, bedankt ... - rahmanisback
Scherm heeft een hele reeks commando's, allemaal beginnend met Ctrl-a. Als je er maar één extra leert, begin je met "Ctrl-a?". Dan zul je niet "Ctrl-a c" en "Ctrl-a n" leren - olafure
@olafure +1, bedankt. Het lijkt erop dat Screen mijn belangrijkste toolbox zal zijn. - rahmanisback
tmux > scherm. Probeer het, je zult nooit meer teruggaan. - h0tw1r3
+1 voor tmux. Ik heb het scherm 5 weken geleden opgegeven. - Bryan Hunt


In bash, de disown zoekwoord is hier perfect geschikt voor. Voer eerst uw proces op de achtergrond uit (gebruik dit &of ^Z typ dan bg):

$ wget --quiet http://server/some_big_file.zip &
[1] 1156

Door te typen jobs je kunt zien dat het proces nog steeds eigendom is van de shell:

$ jobs
[1]+  Running  wget

Als u op dit punt uitlogt, wordt de achtergrondtaak ook gedood. Echter, als je rent disown, bash maakt de taak los en laat deze verder draaien:

$ disown

U kunt dit bevestigen:

$ jobs
$ logout

Je kunt zelfs het & en disown op dezelfde regel, zoals:

$ wget --quiet http://server/some_big_file.zip & disown
$ logout

Dit is beter dan hardlopen nohup naar mijn mening omdat het niet weggaat nohup.out bestanden bezaaid over uw bestandssysteem. Ook, nohup moet worden uitgevoerd voordat u de opdracht uitvoert: disown kan worden gebruikt als u later alleen besluit dat u de achtergrond wilt gebruiken en de taak wilt loskoppelen.


70
2017-09-15 12:27



Dat is een heel goed antwoord, 1+. De enige voorkeur voor nohup of Screen zou de onafhankelijkheid van bash zijn en zou met een andere shell kunnen worden gebruikt. Maar ik zal vasthouden aan je aanpak wanneer ik bash gebruik. - rahmanisback
Ja - dit is bash-specifiek, omdat bash de enige shell is die ik ooit heb gebruikt. Ik vraag me af of andere shells iets soortgelijks ondersteunen (dat wil zeggen lancering op de achtergrond zonder nohup) - het zou fantastisch zijn als iemand andere antwoorden kon posten voor andere shells. - Jeremy Visser
zie mijn antwoord laten zien hoe het te doen met elke sh-lookalike - w00t
+1 omdat je later kunt beslissen. Op dit moment had ik hier behoefte aan. werkte zoals geadverteerd - code_monk


De tool nohup, beschikbaar op de meeste Linux-boxen, zal dit doen.


37
2017-09-15 06:14



Dit is verreweg het eenvoudigste antwoord. Elke uitvoer van wordt automatisch doorgestuurd naar nohup.out en kan later worden bekeken. - Julian
nohup heeft helemaal geen zsh nodig. - Aaron Brown
neehup is het juiste antwoord, het is een afkorting voor geen ophanging. - Kinjal Dixit
nohup is te vinden op veel meer machines dan op het scherm, dus je moet weten hoe je het moet gebruiken. - Zenon


Gewoon om grondig te zijn, zal ik erop wijzen tmux, dat hetzelfde basisidee heeft als scherm:

tmux is bedoeld als een modern, door BSD goedgekeurd alternatief voor programma's zoals het GNU-scherm. Belangrijke kenmerken zijn onder meer:

  • Een krachtige, consistente, goed gedocumenteerde en gemakkelijk scriptbare command-interface.
  • Een venster kan horizontaal en verticaal in ruiten worden gesplitst.
  • Ruiten kunnen vrij worden verplaatst en van grootte worden veranderd, of worden gerangschikt in vooraf ingestelde lay-outs.
  • Ondersteuning voor UTF-8 en 256-kleuren terminals.
  • Kopieer en plak met meerdere buffers.
  • Interactieve menu's om vensters, sessies of clients te selecteren.
  • Wijzig het huidige venster door te zoeken naar tekst in het doel.
  • Klemmen vergrendelen, handmatig of na een time-out.
  • Een schone, gemakkelijk verlengde BSD-gelicentieerde codebase, in actieve ontwikkeling.

Het is echter ongeveer oneindig veel eenvoudiger om op Google te zoeken.


27
2017-09-15 06:23



Gebruik makend van "gnu screen" omdat uw zoekopdracht vrij goed werkt. - gnur
+1000 voor tmux! - mbq


Scherm is overkill om processen gewoon door te laten gaan als u uitlogt.

Proberen dtach:

dtach is een programma geschreven in C dat de losfunctie van emuleert   scherm, waarmee een programma kan worden uitgevoerd in een omgeving die   is beschermd tegen de controleterminal. Bijvoorbeeld het programma   onder de controle van dtach zou niet beïnvloed worden door de terminal zijnde   verbroken om wat voor reden dan ook.

dtach werd geschreven omdat het scherm niet voldoende aan mijn behoeften voldeed; ik   had geen extra functies van het scherm nodig, zoals ondersteuning voor meerdere   terminals of terminal-emulatieondersteuning. scherm was ook te groot,   omvangrijk en had een broncode die moeilijk te begrijpen was.

scherm ook interfereerde met mijn gebruik van volledig scherm applicaties zoals   emacs en ircII, vanwege de overmatige interpretatie van de stream   tussen het programma en de aangesloten terminals. dtach heeft geen   terminal-emulatielaag en geeft de onbewerkte uitvoerstroom van de   programmeer naar de aangesloten terminals. De enige invoer die dat verwerkt   dtach doet wel is scannen naar het ontkoppelingskarakter (welke signalen   dtach om los te koppelen van het programma) en de slaapstandsleutel te verwerken   (die dtach opdracht geeft om zichzelf tijdelijk te onderbreken zonder de   lopend programma), en beide kunnen indien gewenst worden uitgeschakeld.

In tegenstelling tot het scherm heeft dtach minimale functies en is uiterst klein.   Hierdoor kan dtach gemakkelijker worden gecontroleerd op fouten en beveiliging   gaten, en maakt het toegankelijk in omgevingen waar de ruimte beperkt is,   zoals op reddingsschijven.


11
2017-09-15 15:06



Dank je. Ik kwam hier alleen om over dtach te posten. Het is mijn go-to ding voor terminal detachement nu; scherm doet VEEL te veel, en interfereert met inbreng tot een belachelijke mate. Het feitenscherm heeft zijn eigen termcap nodig is behoorlijk verontrustend. - fluffy


Hier is een manier om elk shell-proces te daemoniseren, geen externe programma's nodig:

( while sleep 5; do date; done ) <&- >output.txt &

Wanneer u vervolgens uw sessie sluit, blijft de taak uitvoeren zoals wordt geïllustreerd door het bestand output.txt (dat buffert, zodat het even duurt om niet-nul te tonen). Vergeet niet om je baan te doden na het testen.

Dus alles wat je hoeft te doen is de achtergrond en de achtergrond sluiten. Om eerst echt goed te zijn cd / dus je houdt niet vast aan een vatting.

Dit werkt zelfs in eenvoudige sh onder Solaris.


9
2017-09-16 16:48



Interessant. Dat waren enkele opmerkelijke vragen. Ik kan zien dat je de STDIN op niets hebt ingesteld, de - operator? Wat is het verschil tussen < /dev/null en &- ? Ik vermoed dat STDIN (en anderen STDOUT en STDERR) een bestand konden krijgen door < file, of een stream van <& stream in het geval van STDIN. Zou het hetzelfde zijn met < /dev/null in jouw voorbeeld hierboven? En doet de exploitant - hierboven verwijzen naar een nul als de stroom? - rahmanisback
Wanneer u x <& - uitvoert, wordt bestandsbeschrijving x gesloten. In dit geval is er geen x, wat bash standaard maakt op 1, d.w.z. standaard invoer. Als je </ dev / null gebruikt, sluit je stdin niet, je geeft gewoon een leeg bestand aan het programma als invoer. - w00t
En om eerlijk te zijn, ik weet niet echt waarom dit het spel demonstreert :-) Het werkt echter wel, we gebruiken het in de productie. Ik ontdekte het terwijl ik aan het rommelen was in de hoop dat ik een proces in de schaal kon daemoniseren zonder iets bijzonders te hoeven doen - dus begon ik met het sluiten van stdin en dat was genoeg. Ik zou wat shell-bronnen moeten gaan lezen, maar ik neem aan dat als je stdin en achtergrond sluit het proces, het ook het proces ontkoppelt. - w00t
Ik denk dat de reden is dat een SIGHUP (het daadwerkelijke signaal dat ervoor zorgt dat het kind stopt wanneer de shell sterft) wordt geactiveerd wanneer een parent-proces de stdin-handle van zijn kind sluit. Echter, als stdin begint met als null, in plaats van achteraf gesloten te zijn, kan de ouder de SIGHUP niet activeren. Leuke vondst echter nooit gedacht. - Jeremy Visser
@JeremyVisser klinkt heel plausibel! - w00t


De at commando kan handig zijn voor dit soort situaties. Typ bijvoorbeeld:

at now

En u kunt vervolgens een opdracht of reeks opdrachten invoeren die zal worden uitgevoerd. De resultaten moeten per e-mail naar u worden verzonden als de e-mail correct is ingesteld op het apparaat.

In plaats van now, je kunt een tijd specificeren met een datum, of een tijdsuitdrukking zoals now + 15 minutes. Zien man at voor meer details.


7
2017-09-16 08:23





byobu op Ubuntu is een leuke front-end om te screenen. Door te drukken Ctrl-? je krijgt een lijst met alle sneltoetsen. Het voegt een statusbalk toe die handig kan zijn voor het bekijken van CPU-belasting, schijfruimte, etc. In het algemeen biedt het een ervaring die ik zou beschrijven als een terminal-gebaseerde VNC-verbinding.

nohup staat het starten van een taak op de achtergrond toe met zijn uitvoer gerouteerd naar een logbestand, dat altijd kan worden omgeleid naar / dev / null indien niet vereist.


7
2017-09-15 13:26