Achtergrondprocessen uitvoeren en besturen op Linux

Een shell-omgeving op een Linux-computer.
Fatmawati Achmad Zaenuri / Shutterstock.com

Gebruik de Bash-shell in Linux om voorgrond- en achtergrondprocessen te beheren. U kunt de functies en signalen voor taakbeheer van Bash gebruiken om u meer flexibiliteit te geven bij het uitvoeren van opdrachten. We laten je zien hoe.

Alles over processen

Telkens wanneer een programma wordt uitgevoerd in een Linux- of Unix-achtig besturingssysteem, wordt een proces gestart. “Proces” is de naam voor de interne weergave van het uitvoerende programma in het computergeheugen. Voor elk actief programma is er een proces. In feite is er een proces voor bijna alles dat op uw computer wordt uitgevoerd. Dat omvat de componenten van uw grafische desktopomgeving (GDE) zoals GNOME of KDE, en systeemdaemons die worden gestart bij het opstarten.

Waarom bijna alles dat draait? Welnu, ingebouwde Bash-ins zoals cd, pwd en alias hoeven geen proces te hebben gestart (of “spawned”) wanneer ze worden uitgevoerd. Bash voert deze opdrachten uit binnen de instantie van de Bash-shell die in uw terminalvenster wordt uitgevoerd. Deze opdrachten zijn snel, juist omdat er geen proces voor hoeft te worden gestart om ze uit te voeren. (Jij kan typen help in een terminalvenster om de lijst met ingebouwde Bash te zien.)

Processen kunnen op de voorgrond worden uitgevoerd, in welk geval ze uw terminal overnemen totdat ze zijn voltooid, of ze kunnen op de achtergrond worden uitgevoerd. Processen die op de achtergrond worden uitgevoerd, domineren het terminalvenster niet en u kunt erin blijven werken. Of ze domineren in ieder geval het terminalvenster niet als ze geen schermuitvoer genereren.

Een rommelig voorbeeld

We beginnen met een simpele ping trace rennen. Zouden gaan ping het How-To Geek-domein. Dit wordt uitgevoerd als een voorgrondproces.

ping www.howtogeek.com

ping www.howtogeek.com in een terminalvenster

We krijgen de verwachte resultaten door naar beneden te scrollen in het terminalvenster. We kunnen niets anders doen in het terminalvenster ping is aan het rennen. Om het commando te beëindigen, klik op Ctrl+C.

Ctrl+C

ping trace-uitvoer in een terminalvenster

Het zichtbare effect van de Ctrl+C is gemarkeerd in de schermafbeelding. ping geeft een korte samenvatting en stopt dan.

Laten we dat herhalen. Maar deze keer slaan we toe Ctrl+Z in plaats van Ctrl+C. De taak wordt niet beëindigd. Het wordt een achtergrondtaak. We krijgen de controle over het terminalvenster terug naar ons.

ping www.howtogeek.com
Ctrl+Z

effect van Ctrl + Z op een commando dat in een terminalvenster wordt uitgevoerd

Het zichtbare effect van slaan Ctrl+Z is gemarkeerd in de schermafbeelding.

Deze keer wordt ons verteld dat het proces is gestopt. Gestopt betekent niet beëindigd. Het is als een auto bij een stopbord. We hebben het niet gesloopt en weggegooid. Hij is nog steeds onderweg, stationair, wachtend om te vertrekken. Het proces is nu een achtergrond baan.

De jobs opdracht geeft een lijst van de taken die zijn gestart in de huidige terminalsessie. En omdat banen (onvermijdelijk) processen zijn, kunnen we ook de ps commando om ze te zien. Laten we beide opdrachten gebruiken en hun uitvoer vergelijken. We gebruiken de T optie (terminal) optie om alleen de processen weer te geven die in dit terminalvenster worden uitgevoerd. Merk op dat u geen koppelteken hoeft te gebruiken - met de T optie.

jobs
ps T

jobs in een terminalvenster

De jobs commando vertelt ons:

  • [1]: Het nummer tussen vierkante haken is het jobnummer. We kunnen dit gebruiken om naar de taak te verwijzen wanneer we deze moeten besturen met taakbesturingsopdrachten.
  • +: Het plusteken + laat zien dat dit de taak is die zal worden uitgevoerd als we een taakbeheeropdracht gebruiken zonder een specifiek taaknummer. Dit wordt de standaardtaak genoemd. De standaardtaak is altijd de taak die het laatst aan de lijst met taken is toegevoegd.
  • Gestopt: Het proces wordt niet uitgevoerd.
  • ping www.howtogeek.com: De opdrachtregel waarmee het proces is gestart.

De ps commando vertelt ons:

  • PID: De proces-ID van het proces. Elk proces heeft een unieke ID.
  • TTY: Het pseudo-teletype (terminalvenster) waaruit het proces is uitgevoerd.
  • STAT: De status van het proces.
  • TIJD: De hoeveelheid CPU-tijd die door het proces wordt verbruikt.
  • OPDRACHT: De opdracht waarmee het proces is gestart.

Dit zijn algemene waarden voor de STAT-kolom:

  • D: Ononderbroken slaap. Het proces bevindt zich in een wachttoestand, meestal wachtend op invoer of uitvoer, en kan niet worden onderbroken.
  • ik: Inactief.
  • R: Rennen.
  • S: Onderbreekbare slaap.
  • T: Gestopt door een taakcontrolesignaal.
  • Z: Een zombieproces. Het proces is beëindigd, maar is niet “opgeschoond” door het bovenliggende proces.

De waarde in de STAT-kolom kan worden gevolgd door een van deze extra indicatoren:

  • <: Taak met hoge prioriteit (niet prettig voor andere processen).
  • N: Lage prioriteit (prettig voor andere processen).
  • L.: proces heeft pagina’s vergrendeld in het geheugen (meestal gebruikt door real-time processen).
  • s: Een sessieleider. Een sessieleider is een proces dat procesgroepen heeft gelanceerd. Een shell is een sessieleider.
  • l: Multi-thread-proces.
  • +: Een voorgrondproces.

We kunnen zien dat Bash een toestand heeft van Ss. De hoofdletter “S” vertelt ons dat de Bash-shell slaapt en dat deze onderbreekbaar is. Zodra we het nodig hebben, zal het reageren. De kleine “s” vertelt ons dat de shell een sessieleider is.

Het ping-commando heeft de status T. Dit vertelt ons dat ping is gestopt door een taakcontrolesignaal. In dit voorbeeld was dat de Ctrl+Z we plaatsten het vroeger op de achtergrond.

De ps T commando heeft de status R, wat staat voor hardlopen. De + geeft aan dat dit proces lid is van de voorgrondgroep. Dus de ps T commando wordt uitgevoerd op de voorgrond.

Het bg-commando

De bg commando wordt gebruikt om een ​​achtergrondproces te hervatten. Het kan met of zonder jobnummer worden gebruikt. Als u het zonder jobnummer gebruikt, wordt de standaardjob naar de voorgrond gebracht. Het proces wordt nog steeds op de achtergrond uitgevoerd. Je kunt er geen input naar sturen.

Als we het bg commando, zullen we onze ping opdracht:

bg

bg in een terminalvenster

De ping commando hervat en we zien de scrollende output weer in het terminalvenster. De naam van de opdracht die opnieuw is gestart, wordt voor u weergegeven. Dit wordt gemarkeerd in de schermafbeelding.

hervat ping-achtergrondproces met uitvoer in een terminalweduwe

Maar we hebben een probleem. De taak wordt op de achtergrond uitgevoerd en accepteert geen invoer. Dus hoe kunnen we het stoppen? Ctrl+C doet niets. We kunnen het zien wanneer we het typen, maar de achtergrondtaak ontvangt die toetsaanslagen niet, dus het blijft vrolijk pingen.

Achtergrondtaak die Ctrl + C negeert in een terminalvenster

In feite bevinden we ons nu in een vreemde gemengde modus. We kunnen in het terminalvenster typen, maar wat we typen wordt snel weggevaagd door de scrollende uitvoer van het ping opdracht. Alles wat we typen, wordt van kracht op de voorgrond.

Om onze achtergrondtaak te stoppen, moeten we deze naar de voorgrond brengen en vervolgens stoppen.

Het fg-commando

De fg commando zal een achtergrondtaak naar de voorgrond brengen. Net als de bg commando, kan het worden gebruikt met of zonder een jobnummer. Als u het gebruikt met een taaknummer, werkt het voor een specifieke taak. Als het wordt gebruikt zonder een taaknummer, wordt het laatste commando gebruikt dat naar de achtergrond is gestuurd.

Als we typen fg onze ping commando wordt naar de voorgrond gebracht. De tekens die we typen worden door elkaar gehaald met de uitvoer van de ping commando, maar ze worden bediend door de shell alsof ze zoals gewoonlijk op de commandoregel zijn ingevoerd. En in feite, vanuit het standpunt van de Bash-schaal, is dat precies wat er is gebeurd.

fg

fg-commando gemengd met de uitvoer van ping in een terminalvenster

En nu we de ping commando dat nogmaals op de voorgrond draait, kunnen we gebruiken Ctrl+C om het te doden.

Ctrl+C

Ctrl + C stopt de ping-opdracht in een terminalvenster

We moeten de juiste signalen sturen

Dat was niet bepaald mooi. Het is duidelijk dat het uitvoeren van een proces op de achtergrond het beste werkt als het proces geen uitvoer oplevert en geen invoer vereist.

Maar, rommelig of niet, ons voorbeeld heeft bereikt:

  • Een proces op de achtergrond zetten.
  • Het proces op de achtergrond herstellen naar een actieve staat.
  • Het proces terugbrengen naar de voorgrond.
  • Het proces beëindigen.

Wanneer u Ctrl+C en Ctrl+Z zendt u signalen naar het proces. Dit zijn verkorte manieren om de kill opdracht. Er zijn 64 verschillende signalen die kill kan versturen. Gebruik kill -l op de opdrachtregel om ze weer te geven. kill is niet de enige bron van deze signalen. Sommigen van hen worden automatisch gegenereerd door andere processen binnen het systeem

Hier zijn enkele van de meest gebruikte.

  • SIGHUP: Signaal 1. Wordt automatisch naar een proces gestuurd wanneer de terminal waarin het wordt uitgevoerd, is gesloten.
  • SIGINT: Signaal 2. Verzonden naar een proces dat je hebt geraakt Ctrl+C. Het proces wordt onderbroken en er wordt gezegd dat het moet worden beëindigd.
  • SIGQUIT: Signaal 3. Wordt naar een proces gestuurd als de gebruiker een quit-signaal verzendt Ctrl+D.
  • SIGKILL: Signaal 9. Het proces wordt onmiddellijk afgebroken en zal niet proberen netjes af te sluiten. Het proces verloopt niet gracieus.
  • SIGTERM: Signaal 15. Dit is het standaardsignaal dat wordt verzonden door kill. Het is het standaard beëindigingssignaal van het programma.
  • SIGTSTP: Signaal 20. Verzonden naar een proces wanneer u gebruikt Ctrl+Z. Het stopt het proces en zet het op de achtergrond.

We moeten de kill commando om signalen af ​​te geven waaraan geen toetscombinaties zijn toegewezen.

Verdere taakcontrole

Een proces dat naar de achtergrond is verplaatst door te gebruiken Ctrl+Z wordt in de gestopte toestand geplaatst. We moeten de bg opdracht om het opnieuw te starten. Een programma starten als een lopend achtergrondproces is eenvoudig. Voeg een ampersand toe & aan het einde van de opdrachtregel.

Hoewel het het beste is dat achtergrondprocessen niet naar het terminalvenster schrijven, gaan we voorbeelden gebruiken die dat wel doen. We moeten iets in de schermafbeeldingen hebben waarnaar we kunnen verwijzen. Deze opdracht start een eindeloze lus als achtergrondproces:

terwijl waar; echo “How-To Geek Loop Process”; slaap 3; gedaan &

terwijl waar;  echo "How-To Geek Loop Process";  slaap 3;  gedaan & in een terminalvenster

We krijgen het taaknummer en de proces-ID-ID van het proces te horen. Ons jobnummer is 1, en het proces-ID is 1979. We kunnen deze identificatiegegevens gebruiken om het proces te controleren.

De uitvoer van onze eindeloze lus begint in het terminalvenster te verschijnen. Zoals eerder kunnen we de opdrachtregel gebruiken, maar alle opdrachten die we geven, worden afgewisseld met de uitvoer van het lusproces.

ls

uitvoer van het achtergrondlusproces afgewisseld met uitvoer van andere opdrachten

Om ons proces te stoppen kunnen we gebruiken jobs om onszelf eraan te herinneren wat het jobnummer is, en gebruik dan kill.

jobs meldt dat ons proces baan nummer 1 is. Om dat nummer te gebruiken met kill we moeten het voorafgaan met een procentteken %.

jobs
kill %1

jobs en kill% 1 in een terminalvenster

kill stuurt het SIGTERM signaal, signaal nummer 15, naar het proces en het wordt beëindigd. Wanneer de Enter-toets de volgende keer wordt ingedrukt, wordt een status van de taak weergegeven. Het vermeldt het proces als ‘beëindigd’. Als het proces niet reageert op het kill commando kun je het een tandje hoger zetten. Gebruik kill met SIGKILL , signaal nummer 9. Zet gewoon het nummer 9 tussen de kill commando het jobnummer.

kill 9 %1

Dingen die we hebben behandeld

  • Ctrl + C: Verzendt SIGINT, signaal 2, naar het proces – als het invoer accepteert – en vertelt het te beëindigen.
  • Ctrl + D: Verzendt SISQUIT, signaal 3, naar het proces – als het invoer accepteert – en vertelt het te stoppen.
  • Ctrl + Z: Verzendt SIGSTP, signaal 20, naar het proces en vertelt het te stoppen (onderbreken) en een achtergrondproces te worden.
  • banen: Geeft een overzicht van de achtergrondtaken en toont hun taaknummer.
  • bg baannummer: Start een achtergrondproces opnieuw. Als u geen taaknummer opgeeft, wordt het laatste proces dat in een achtergrondtaak werd omgezet, gebruikt.
  • fg baannummer: brengt een achtergrondproces naar de voorgrond en start het opnieuw. Als u geen taaknummer opgeeft, wordt het laatste proces dat is omgezet in een achtergrondtaak, gebruikt.
  • opdrachtregel &: Een ampersand toevoegen & aan het einde van een opdrachtregel voert die opdracht uit als een achtergrondtaak, die wordt uitgevoerd.
  • doden %baannummer: Verzendt SIGTERM, signaal 15, naar het proces om het te beëindigen.
  • doden 9 %baannummer: Verzendt SIGKILL, signaal 9, naar het proces en beëindigt het abrupt.

VERWANT: Processen beëindigen vanaf de Linux-terminal

Nieuwste artikelen

spot_img

Related Stories

Leave A Reply

Vul alstublieft uw commentaar in!
Vul hier uw naam in