- Dave McKay
@TheGurkha
- 24 September 2019, 8:00am EDT
gebruik de Bash Shell in linux om voor-en achtergrondprocessen te beheren. U kunt Bash ’s job control functies en signalen gebruiken om u meer flexibiliteit te geven in de manier waarop u commando’ s uitvoert. We laten je zien hoe.
alles over processen
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 geheugen van de computer. Er is een proces voor elk actief programma. In feite, er is een proces voor bijna alles dat wordt uitgevoerd op uw computer. Dat omvat de componenten van uw grafische desktopomgeving (gde) zoals GNOME of KDE, en systeemdaemons die worden gestart bij het opstarten.
waarom bijna alles wat draait? Goed, Bash ingebouwde-ins zoals cd, PWD, en alias niet nodig om een proces gestart (of “spawned”) wanneer ze worden uitgevoerd., Bash voert deze commando ‘ s uit in de instantie van de Bash shell die draait in uw terminal venster. Deze commando ‘ s zijn snel, juist omdat ze geen proces nodig hebben om ze uit te voeren. (U kunt help
typen in een terminalvenster om de lijst met Bash-ingebouwde instellingen te zien.)
processen kunnen op de voorgrond draaien, in welk geval ze uw terminal overnemen totdat ze zijn voltooid, of ze kunnen op de achtergrond worden uitgevoerd., Processen die op de achtergrond draaien domineren het terminalvenster niet en je kunt erin blijven werken. Of tenminste, ze domineren het terminalvenster niet als ze geen schermuitvoer genereren.
een rommelig voorbeeld
we starten een eenvoudige ping
trace draaien. We gaan naar ping
Het How-To Geek domein. Dit zal worden uitgevoerd als een foreground proces.
ping www.howtogeek.com
we krijgen de verwachte resultaten door naar beneden te scrollen in het terminalvenster. We kunnen niets anders doen in het terminalvenster terwijl ping
draait., Om het commando te beëindigen druk je op Ctrl+C
.
Ctrl+C
het zichtbare effect van Ctrl+C
wordt gemarkeerd in de schermafbeelding. ping
geeft een korte samenvatting en stopt.
laten we dat herhalen. Maar deze keer raken we Ctrl+Z
in plaats van Ctrl+C
. De taak wordt niet beëindigd. Het zal een achtergrond taak worden. We krijgen de controle over het terminalvenster terug.,
ping www.howtogeek.com
Ctrl+Z
het zichtbare effect van het raken van Ctrl+Z
wordt 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. Het is nog steeds op de weg, stationair, wachtend om te gaan. Het proces is nu een achtergrond job.
het jobs
commando toont de taken die zijn gestart in de huidige terminalsessie., En omdat taken (onvermijdelijk) processen zijn, kunnen we ook het ps
commando gebruiken om ze te zien. Laten we beide commando ‘ s gebruiken en hun uitgangen vergelijken. We zullen de T
optie (terminal) optie gebruiken om alleen de processen te tonen die in dit terminalvenster draaien. Merk op dat het niet nodig is om een koppelteken -
te gebruiken met de optie T
.
jobs
ps T
de opdracht jobs
vertelt ons:
- : het nummer tussen vierkante haakjes is het taaknummer., We kunnen dit gebruiken om naar de taak te verwijzen wanneer we deze moeten controleren met job control commando ‘ s.
- +: het plusteken
+
geeft aan dat dit de taak is die zal worden uitgevoerd als we een opdracht voor taakbeheer zonder een specifiek taaknummer gebruiken. Het wordt de standaardtaak genoemd. De standaardtaak is altijd degene die het laatst is toegevoegd aan de lijst met taken. - gestopt: het proces draait niet.
- ping www.howtogeek.com: de opdrachtregel die het proces heeft gestart.,
het ps
Commando vertelt ons:
- PID: het proces-ID van het proces. Elk proces heeft een unieke ID.
- TTY: het pseudo-teletype (terminalvenster) waarvan het proces werd uitgevoerd.
- STAT: de status van het proces.
- tijd: de hoeveelheid CPU – tijd die door het proces wordt verbruikt.
- Commando: het commando dat het proces opstartte.
Dit zijn gemeenschappelijke waarden voor de kolom STAT:
- D: Uninterruptible sleep. Het proces bevindt zich in een Wachttoestand, meestal wachtend op invoer of uitvoer, en kan niet worden onderbroken.,
- I: Inactief.
- R: actief.
- S: onderbreekbare slaap.
- T: gestopt door een taakbesturingssignaal.
- Z: een zombie-proces. Het proces is beëindigd, maar is niet “opgeschoond” door het ouderproces.
de waarde in de kolom STAT kan worden gevolgd door een van deze extra indicatoren:
- <: taak met hoge prioriteit (niet leuk voor andere processen).
- N: lage prioriteit (leuk 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 gestart. Een shell is een sessieleider.
- l: Meerdraadproces.
- +: een voorgrondproces.
We kunnen zien dat Bash een status heeft van Ss
. De hoofdletters ” S ” vertellen ons dat de Bash shell slaapt, en het is onderbreekbaar. Zodra we het nodig hebben, zal het reageren. De kleine letter ” s ” vertelt ons dat de shell een sessieleider is.
het commando ping heeft een status van T
., Dit vertelt ons dat ping
is gestopt door een taakcontrolesignaal. In dit voorbeeld was dat de Ctrl+Z
die we gebruikten om het op de achtergrond te zetten.
het ps T
commando heeft een status van R
, wat staat voor hardlopen. De +
geeft aan dat dit proces lid is van de voorgrond groep. Dus het ps T
Commando draait op de voorgrond.
het bg Commando
het bg
commando wordt gebruikt om een achtergrondproces te hervatten., Het kan worden gebruikt met of zonder een taaknummer. Als u het zonder taaknummer gebruikt, wordt de standaardtaak op de voorgrond geplaatst. Het proces loopt nog steeds op de achtergrond. Je kunt er geen input naar sturen.
als we het bg
commando geven, zullen we ons ping
Commando:
bg
Het ping
Commando hervatten en we zien de Nogmaals scrollen van de uitvoer in het terminalvenster. De naam van de opdracht die opnieuw is gestart wordt voor u weergegeven., Dit wordt gemarkeerd in de screenshot.
maar we hebben een probleem. De taak draait op de achtergrond en accepteert geen invoer. Hoe stoppen we het? Ctrl+C
doet niets. We kunnen het zien als we het typen, maar de achtergrond taak niet ontvangen die toetsaanslagen, zodat het blijft pingen vrolijk weg.
in feite bevinden we ons nu in een vreemde gemengde modus. We kunnen typen in het terminalvenster, maar wat we typen wordt snel weggevaagd door de scrollende uitvoer van het ping
Commando. Alles wat we typen werkt in de foregound.,
om onze achtergrondtaak te stoppen moeten we deze naar de voorgrond brengen en dan stoppen.
het commando fg
het commando fg
brengt een achtergrondtaak op de voorgrond. Net als het bg
commando, kan het gebruikt worden met of zonder een taaknummer. Gebruik het met een job nummer betekent dat het zal werken op een specifieke taak. Als het zonder taaknummer wordt gebruikt, wordt het laatste commando dat naar de achtergrond is gestuurd, gebruikt.
als we fg
typen zal ons ping
commando op de voorgrond worden geplaatst., De karakters die we typen worden vermengd met de uitvoer van het ping
Commando, maar ze worden bediend door de shell alsof ze op de commandoregel waren ingevoerd zoals gewoonlijk. En in feite, vanuit het oogpunt van de Bash shell, is dat precies wat er gebeurd is.
fg
en nu we het ping
commando weer op de voorgrond draaien, kunnen we Ctrl+C
gebruiken om het te stoppen.
Ctrl+C
we moeten de juiste signalen sturen
die niet bepaald mooi waren., Blijkbaar werkt het uitvoeren van een proces op de achtergrond het beste wanneer het proces geen output produceert en geen input vereist.
maar, rommelig of niet, ons voorbeeld heeft het volgende bereikt:
- een proces op de achtergrond zetten.
- het proces terugzetten naar een draaiende toestand op de achtergrond.
- het proces terug naar de voorgrond.
- het proces wordt beëindigd.
wanneer u Ctrl+C
en Ctrl+Z
gebruikt , stuurt u signalen naar het proces. Dit zijn stenografische manieren om het kill
commando te gebruiken., Er zijn 64 verschillende signalen die kill
kan verzenden. Gebruik kill -l
op de opdrachtregel om ze te tonen. kill
is niet de enige bron van deze signalen. Sommige worden automatisch verhoogd door andere processen binnen het systeem
Hier zijn enkele van de veelgebruikte.
- SIGHUP: signaal 1. Automatisch verzonden naar een proces wanneer de terminal waarin het draait is gesloten.
- SIGINT: signaal 2. Verzonden naar een proces dat u op
Ctrl+C
drukt. Het proces wordt onderbroken en verteld om te beëindigen., - SIGQUIT: signaal 3. Verzonden naar een proces als de gebruiker een afsluitsignaal stuurt
Ctrl+D
. - SIGKILL: signaal 9. Het proces wordt onmiddellijk gedood en zal niet proberen om schoon te sluiten. Het proces verloopt niet gracieus.
- SIGTERM: signaal 15. Dit is het standaard signaal dat wordt verzonden door
kill
. Het is het standaard programma-beëindigingssignaal. - SIGTSTP: signaal 20. Verzonden naar een proces wanneer u
Ctrl+Z
gebruikt. Het stopt het proces en zet het op de achtergrond.,
we moeten het kill
commando gebruiken om signalen uit te geven die geen toetscombinaties hebben toegewezen.
verdere Taakbesturing
een proces dat naar de achtergrond is verplaatst met Ctrl+Z
wordt in de gestopt toestand geplaatst. We moeten het bg
commando gebruiken om het opnieuw te starten. Om een programma te starten als een lopende achtergrond proces 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 screenshots hebben waar we naar kunnen verwijzen. Dit commando start een eindeloze lus als achtergrondproces:
terwijl true; do echo “How-To Geek Loop Process”; sleep 3; done &
we krijgen het taaknummer en proces ID id van het proces te horen. Ons werknummer is 1, en het proces id is 1979. We kunnen deze identifiers gebruiken om het proces te controleren.,
De uitvoer van onze eindeloze lus begint te verschijnen in het terminalvenster. Zoals voorheen kunnen we de opdrachtregel gebruiken, maar alle opdrachten die we uitgeven worden afgewisseld met de uitvoer van het loop-proces.
ls
om ons proces te stoppen kunnen we jobs
gebruiken om onszelf eraan te herinneren wat het taaknummer is, en dan kill
gebruiken.
jobs
meldt dat ons proces taak nummer 1 is. Om dat getal te gebruiken met kill
moeten we het voorafgaan met een procentteken %
.,
jobs
kill %1
kill
stuurt het SIGTERM
signaal, signaalnummer 15, naar het proces en wordt beëindigd. Wanneer de Enter-toets vervolgens wordt ingedrukt, wordt een status van de taak weergegeven. Het geeft het proces als ” beëindigd.”Als het proces niet reageert op het kill
commando kun je het een stapje hoger zetten. Gebruik kill
met SIGKILL
, signaalnummer 9. Plaats gewoon het nummer 9 tussen het kill
Commando het taaknummer.,
kill 9 %1
dingen die we hebben behandeld
- Ctrl+C: stuurt
SIGINT
, signaal 2, naar het proces—als het invoer accepteert—en vertelt het te beëindigen. - Ctrl + D: stuurt
SISQUIT
, signaal 3, naar het proces—als het invoer accepteert—en vertelt het te stoppen. - Ctrl + Z: stuurt
SIGSTP
, signaal 20, naar het proces en vertelt het te stoppen (onderbreken) en een achtergrondproces te worden. - taken: geeft de achtergrondtaken weer en toont hun taaknummer.
- bg job_number: Herstart een achtergrondproces., Als u geen taaknummer opgeeft, wordt het laatste proces dat is omgezet in een achtergrondtaak gebruikt.
- FG job_number: brengt een achtergrondproces op de voorgrond en herstart het. Als u geen taaknummer opgeeft, wordt het laatste proces dat is omgezet in een achtergrondtaak gebruikt.
- commandline &: het toevoegen van een ampersand
&
aan het einde van een opdrachtregel voert dat commando uit als een achtergrondtaak die wordt uitgevoerd. - kill %job_number: stuurt
SIGTERM
, signaal 15, naar het proces om het te beëindigen., - kill 9% job_number: stuurt
SIGKILL
, signaal 9, naar het proces en beëindigt het abrupt.
gerelateerd: hoe processen te doden vanaf de Linux Terminal
Dave McKay gebruikte voor het eerst computers toen geponste papiertape in de mode was, en sindsdien is hij aan het programmeren. Na meer dan 30 jaar in de IT-industrie, is hij nu een fulltime technologie journalist., Tijdens zijn carrière werkte hij als freelance programmeur, manager van een internationaal softwareontwikkelingsteam, IT-serviceprojectmanager en recentelijk als functionaris voor gegevensbescherming. Dave is een Linux evangelist en open source advocaat.Volledige Bio lezen ”