- Dave McKay
@TheGurkha
- 24 September 2019, 8:00 am EDT
Använda Bash shell i Linux för att hantera förgrunden och bakgrunden processer. Du kan använda Bashs jobbkontrollfunktioner och signaler för att ge dig mer flexibilitet i hur du kör kommandon. Vi visar dig hur.
allt om processer
När ett program körs i ett Linux-eller Unix-liknande operativsystem startas en process., ”Process” är namnet på den interna representationen av det verkställande programmet i datorns minne. Det finns en process för varje aktivt program. Faktum är att det finns en process för nästan allt som körs på din dator. Det inkluderar komponenterna i din grafiska skrivbordsmiljö (gde) som GNOME eller KDE, och system daemons som startas vid start.
varför nästan allt som körs? Tja, Bash inbyggda som cd, PWD och alias behöver inte ha en process lanserad (eller ”spawned”) när de körs., Bash utför dessa kommandon i instansen av Bash-skalet som körs i ditt terminalfönster. Dessa kommandon är snabba just för att de inte behöver ha en process lanserad för att de ska kunna utföra. (Du kan skrivahelp
I ett terminalfönster för att se listan över inbyggda bash.)
processer kan köras i förgrunden, i vilket fall de tar över din terminal tills de har slutförts, eller de kan köras i bakgrunden., Processer som körs i bakgrunden dominerar inte terminalfönstret och du kan fortsätta att arbeta i det. Eller åtminstone dominerar de inte terminalfönstret om de inte genererar skärmutmatning.
ett rörigt exempel
vi startar en enkelping
spårkörning. Vi kommer att ping
hur-till-Geek domän. Detta kommer att fungera som en förgrundsprocess.
ping www.howtogeek.com
vi får de förväntade resultaten och rullar ner terminalfönstret. Vi kan inte göra något annat i terminalfönstret medan ping
körs., För att avsluta kommandot hit Ctrl+C
.
Ctrl+C
den synliga effekten avCtrl+C
markeras i skärmdumpen. ping
ger en kort sammanfattning och stannar sedan.
låt oss upprepa det. Men den här gången kommer vi att slå Ctrl+Z
istället förCtrl+C
. Uppgiften kommer inte att avslutas. Det kommer att bli en bakgrundsuppgift. Vi får kontroll över terminalfönstret tillbaka till oss.,
ping www.howtogeek.com
Ctrl+Z
den synliga effekten av att slåCtrl+Z
markeras i skärmdumpen.
den här gången får vi veta att processen stoppas. Stoppad betyder inte avslutad. Det är som en bil vid en stoppskylt. Vi har inte skrotat den och kastat bort den. Det är fortfarande på vägen, stationär, väntar på att gå. Processen är nu ett bakgrundsjobb.
kommandotjobs
listar jobben som har startats under den aktuella terminalsessionen., Och eftersom jobb är (oundvikligen) processer kan vi också använda kommandot ps
för att se dem. Låt oss använda båda kommandona och jämföra deras utgångar. Vi använder alternativet T
(terminal) för att bara lista de processer som körs i det här terminalfönstret. Observera att det inte finns något behov av att använda ett bindestreck -
med alternativet T
.
jobs
ps T
kommandotjobs
talar om för oss:
- : numret inom hakparenteser är jobbnumret., Vi kan använda detta för att hänvisa till jobbet när vi behöver kontrollera det med jobbkontrollkommandon.
- +: plustecknet
+
visar att detta är det jobb som kommer att påverkas om vi använder ett jobbkontrollkommando utan ett specifikt jobbnummer. Det kallas standardjobbet. Standardjobbet är alltid det som senast lades till i listan över jobb. - stoppad: processen körs inte.
- ping www.howtogeek.com: kommandoraden som startade processen.,
kommandotps
talar om för oss:
- PID: process-ID för processen. Varje process har ett unikt ID.
- TTY: pseudo-teletype (terminalfönster) som processen utfördes från.
- STAT: status för processen.
- tid: mängden CPU-tid som förbrukas av processen.
- kommando: kommandot som startade processen.
dessa är gemensamma värden för STAT-kolumnen:
- d: avbrottsfri sömn. Processen är i vänteläge, vanligtvis väntar på ingång eller utgång, och kan inte avbrytas.,
- i: Idle.
- R: kör.
- S: Avbrytbar sömn.
- t: stoppas av en jobbkontrollsignal.
- Z: En zombie process. Processen har avslutats men har inte blivit ”rensad” av sin överordnade process.
värdet i STAT-kolumnen kan följas av en av dessa extra indikatorer:
- <: högprioriterad uppgift (inte trevligt för andra processer).
- n: lågprioritering (nice till andra processer).
- l: processen har sidor låsta i minnet (vanligtvis används av realtidsprocesser).,
- s: en sessionsledare. En sessionsledare är en process som har lanserat processgrupper. Ett skal är en sessionsledare.
- l: flertrådig process.
- +: en förgrundsprocess.
Vi kan se att Bash har ett tillstånd avSs
. Den stora ” s ” berätta Bash skalet sover, och det är avbrytbar. Så snart vi behöver det, kommer det att svara. Små bokstäver ” s ” berättar att skalet är en sessionsledare.
ping-kommandot har ett tillstånd avT
., Detta talar om för oss att ping
har stoppats av en jobbkontrollsignal. I det här exemplet var det Ctrl+Z
vi brukade lägga det i bakgrunden.
kommandotps T
har ett tillstånd avR
, som står för körning. +
indikerar att denna process är medlem i förgrundsgruppen. Så kommandotps T
körs i förgrunden.
kommandot bg
kommandotbg
används för att återuppta en bakgrundsprocess., Den kan användas med eller utan ett jobbnummer. Om du använder det utan ett jobbnummer tas standardjobbet till förgrunden. Processen körs fortfarande i bakgrunden. Du kan inte skicka någon inmatning till den.
om vi utfärdar kommandotbg
kommer vi att återuppta kommandotping
:
bg
kommandotping
återupptas och vi ser rullningsutgången i terminalfönstret igen. Namnet på kommandot som har startats om visas för dig., Detta markeras i skärmdumpen.
men vi har ett problem. Uppgiften körs i bakgrunden och accepterar inte inmatning. Så hur stoppar vi det? Ctrl+C
gör ingenting. Vi kan se det när vi skriver det men bakgrundsuppgiften får inte dessa tangenttryckningar så det håller pinging glatt bort.
faktum är att vi nu är i ett konstigt blandat läge. Vi kan skriva in terminalfönstret, men det vi skriver är snabbt sopas bort av rullningsutgången från kommandotping
. Allt vi skriver träder i kraft i det föregående.,
för att stoppa vår bakgrundsuppgift måste vi ta med den till förgrunden och sedan stoppa den.
kommandot FG
kommandotfg
kommer att föra in en bakgrundsuppgift i förgrunden. Precis som kommandotbg
kan det användas med eller utan ett jobbnummer. Att använda det med ett jobbnummer innebär att det kommer att fungera på ett visst jobb. Om det används utan ett jobbnummer används det sista kommandot som skickades till bakgrunden.
om vi skriverfg
vårtping
– kommando kommer till förgrunden., Tecknen vi skriver är blandade med utmatningen från kommandotping
, men de drivs av skalet som om de hade matats in på kommandoraden som vanligt. Och i själva verket, från Bash shells synvinkel, är det precis vad som har hänt.
fg
och nu när vi har kommandotping
körs i förgrunden en gång till kan vi användaCtrl+C
för att döda det.
Ctrl+C
vi måste skicka rätt signaler
det var inte exakt vackert., Tydligen kör en process i bakgrunden fungerar bäst när processen inte producerar utdata och inte kräver inmatning.
men, rörigt eller inte, gjorde vårt exempel:
- sätta en process i bakgrunden.
- återställa processen till ett löpande tillstånd i bakgrunden.
- returnerar processen till förgrunden.
- avsluta processen.
När du använderCtrl+C
ochCtrl+Z
skickar du signaler till processen. Det här är stenografiskt sätt att använda kommandot kill
., Det finns 64 olika signaler somkill
kan skicka. Användkill -l
på kommandoraden för att lista dem. kill
är inte den enda källan till dessa signaler. Några av dem höjs automatiskt av andra processer inom systemet
Här är några av de vanligaste.
- SIGHUP: Signal 1. Skickas automatiskt till en process när terminalen den körs i är stängd.
- SIGINT: Signal 2. Skickas till en process som du träffar
Ctrl+C
. Processen avbryts och berättas att avsluta., - SIGQUIT: Signal 3. Skickas till en process om Användaren skickar en avsluta signal
Ctrl+D
. - SIGKILL: Signal 9. Processen omedelbart dödas och kommer inte att försöka stänga rent. Processen går inte ner graciöst.
- SIGTERM: Signal 15. Detta är standardsignalen som skickas av
kill
. Det är standardprogrammets termineringssignal. - SIGTSTP: Signal 20. Skickas till en process när du använder
Ctrl+Z
. Det stoppar processen och lägger den i bakgrunden.,
Vi måste använda kommandotkill
för att utfärda signaler som inte har tangentkombinationer tilldelade dem.
ytterligare Jobbkontroll
en process som flyttas in i bakgrunden genom att användaCtrl+Z
placeras i stoppat tillstånd. Vi måste använda kommandot bg
för att starta det igen. Att starta ett program som en pågående bakgrundsprocess är enkelt. Lägg till en ampersand &
till slutet av kommandoraden.,
även om det är bäst att bakgrundsprocesser inte skriver till terminalfönstret, kommer vi att använda exempel som gör det. Vi måste ha något i skärmdumpar som vi kan hänvisa till. Det här kommandot startar en oändlig slinga som en bakgrundsprocess:
medan Sant; gör echo ”How-To Geek Loop Process”; sleep 3; done &
vi får veta jobbnumret och process-ID-id för processen. Vårt jobbnummer är 1, och process-id är 1979. Vi kan använda dessa identifierare för att styra processen.,
utgången från vår oändliga slinga börjar visas i terminalfönstret. Som tidigare kan vi använda kommandoraden men alla kommandon vi utfärdar är interspersed med utgången från loop-processen.
ls
för att stoppa vår process kan vi använda jobs
för att påminna oss själva vad jobbnumret är och sedan använda kill
.
jobs
rapporterar att vår process är jobbnummer 1. För att använda det numret med kill
måste vi föregå det med ett procenttecken%
.,
jobs
kill %1
kill
skickarSIGTERM
signal, signalnummer 15, till processen och det avslutas. När Enter-tangenten trycks in visas en status för jobbet. Det listar processen som ” avslutas.”Om processen inte svarar på kommandot kill
kan du ta upp det. Användkill
medSIGKILL
, signalnummer 9. Lägg bara numret 9 mellankill
kommandot jobbnumret.,
kill 9 %1
saker vi har täckt
- Ctrl+C: skickar
SIGINT
, signal 2, till processen—om det accepterar inmatning—och säger att det ska avslutas. - Ctrl + D: skickar
SISQUIT
, signal 3, till processen—om den accepterar ingång—och säger att den ska sluta. - Ctrl + Z: skickar
SIGSTP
, signal 20, till processen och talar om för den att stoppa (avbryta) och bli en bakgrundsprocess. - jobb: listar bakgrundsjobb och visar deras jobbnummer.
- bg job_number: startar om en bakgrundsprocess., Om du inte anger ett jobbnummer används den sista processen som omvandlades till en bakgrundsuppgift.
- fg job_number: tar in en bakgrundsprocess i förgrunden och startar om den. Om du inte anger ett jobbnummer används den sista processen som omvandlades till en bakgrundsuppgift.
- kommandorad&: lägga till en ampersand
&
till slutet av en kommandorad kör kommandot som en bakgrundsuppgift, som körs. - döda %job_number: skickar
SIGTERM
, signal 15, till processen för att avsluta den., - döda 9% job_number: skickar
SIGKILL
, signal 9, till processen och avslutar det plötsligt.
relaterat: hur man dödar processer från Linux-terminalen
Dave McKay använde först datorer när stansad papperstejp var på modet, och han har programmerat sedan dess. Efter över 30 år i IT-branschen är han nu en heltidsjournalist inom teknik., Under sin karriär har han arbetat som frilansprogrammerare, chef för ett internationellt mjukvaruutvecklingsteam, en IT-tjänst projektledare och senast som dataskyddsansvarig. Dave är en Linux evangelist och öppen källkod förespråkare.Läs hela Bio ”