Grunnleggende om prosesser i Linux med Bash
Lær hvordan du effektivt administrerer forgrunns- og bakgrunnsprosesser i Linux ved hjelp av Bash-skallet. Utforsk Bash’s jobbstyringsfunksjoner og signaler for å få økt kontroll over hvordan kommandoer utføres. Denne veiledningen viser deg de grunnleggende teknikkene.
En dybdeanalyse av prosesser
Hver gang du starter et program i et Linux- eller Unix-basert system, opprettes en prosess. En «prosess» er datamaskinens interne representasjon av programmet mens det kjører i minnet. For hvert aktivt program finnes det en tilhørende prosess. Faktisk er det prosesser for nesten alt som er i aktivitet på datamaskinen din, inkludert elementer i ditt grafiske skrivebordsmiljø (GDE) som GNOME eller KDE, i tillegg til system-demoner som lanseres under oppstart.
Hvorfor «nesten» alt? Vel, interne Bash-kommandoer som cd, pwd og alias krever ikke en egen prosess for å kjøre. Bash utfører disse kommandoene direkte i Bash-skallet som kjører i terminalen. Dette gjør dem raske ettersom de ikke trenger å initiere en ny prosess. (Du kan skrive «help» i terminalen for å se en liste over innebygde Bash-moduler.)
Prosesser kan kjøre i forgrunnen, der de okkuperer terminalen til de er ferdige, eller i bakgrunnen. Bakgrunnsprosesser forstyrrer ikke terminalvinduet, slik at du kan fortsette å jobbe. De forstyrrer i hvert fall ikke terminalen så lenge de ikke genererer synlig utdata.
Et konkret eksempel
La oss ta et enkelt eksempel med en ping-kommando for å demonstrere hvordan prosesser fungerer. Vi skal pinge nettstedet til et fiktivt domene. Denne ping-kommandoen vil i utgangspunktet kjøre som en forgrunnsprosess.
ping www.wdzwdz.com
Som forventet ser vi utskriften fra ping-kommandoen i terminalvinduet. Vi kan ikke bruke terminalen til noe annet før ping er ferdig. For å stoppe ping-kommandoen må vi trykke Ctrl+C.
Ctrl+C
Effekten av Ctrl+C er at ping-kommandoen gir en kort oppsummering og deretter avslutter.
La oss prøve en gang til, men denne gangen trykker vi Ctrl+Z i stedet for Ctrl+C. Denne gangen vil ikke prosessen avsluttes; den vil bli suspendert og flyttet til bakgrunnen. Vi vil da få kontroll over terminalen igjen.
ping www.wdzwdz.com
Ctrl+Z
Terminalen viser at prosessen er stoppet. «Stoppet» betyr ikke «avsluttet». Det betyr at prosessen er midlertidig suspendert, i likhet med en bil som venter ved et stoppskilt. Den er fortsatt «der», men den kjører ikke aktivt. Prosessen er nå en bakgrunnsjobb.
Kommandoen «jobs» lister opp jobbene som er startet i den nåværende terminalsesjonen. Siden jobber er prosesser, kan vi også bruke kommandoen «ps» for å se dem. La oss bruke begge kommandoene og sammenligne utdataene. Vi bruker «-T» (terminal) opsjonen for å kun vise prosesser som kjører i dette terminalvinduet. Merk at bindestrek ikke er nødvendig med «-T».
jobs
ps T
Kommandoen «jobs» informerer oss om følgende:
[1]: Tallet i hakeparentes er jobbnummeret. Dette nummeret kan brukes til å referere til jobben når vi skal kontrollere den med jobbstyringskommandoer.
+: Pluss-tegnet + indikerer at dette er jobben som jobbstyringskommandoer vil operere på dersom ikke et spesifikt jobbnummer er angitt. Dette kalles standardjobben. Standardjobben er alltid den siste som ble lagt til i listen over jobber.
Stoppet: Prosessen kjører ikke.
ping www.wdzwdz.com: Kommandoen som startet prosessen.
Kommandoen «ps» informerer oss om følgende:
PID: Prosess-ID for prosessen. Hver prosess har en unik ID.
TTY: Pseudo-teletype (terminalvindu) der prosessen startet.
STAT: Status for prosessen.
TIME: Mengden CPU-tid som er brukt av prosessen.
COMMAND: Kommandoen som startet prosessen.
Dette er vanlige verdier for STAT-kolonnen:
D: Uavbrutt søvn. Prosessen er i ventetilstand, vanligvis venter på input eller output, og kan ikke avbrytes.
I: Inaktiv.
R: Kjører.
S: Avbrytbar søvn.
T: Stoppet av et jobbstyringssignal.
Z: En zombieprosess. Prosessen har avsluttet, men er ikke ryddet bort av foreldreprosessen.
Verdien i STAT-kolonnen kan følges av en av disse indikatorene:
<: En høy-prioritetsoppgave.
N: En lav-prioritetsoppgave.
L: Prosessen har sider låst i minnet.
S: En øktleder. En øktleder er prosessen som startet gruppen.
s: En flertrådet prosess.
Vi ser at Bash har status «Ss». Den store «S» indikerer at Bash-skallet sover og at den er avbrytbar. Så snart vi trenger den, vil den svare. Den lille «s» indikerer at skallet er en øktleder.
Ping-kommandoen har status «T». Dette viser at ping har blitt stoppet av et jobbstyringssignal. I dette eksemplet var det Ctrl+Z som ble brukt for å sette den i bakgrunnen.
«ps T»-kommandoen har status «R», som står for «running». «+» indikerer at denne prosessen er medlem av forgrunnsgruppen. Så «ps T»-kommandoen kjører i forgrunnen.
Kommandoen «bg»
Kommandoen «bg» brukes for å gjenoppta en bakgrunnsprosess. Den kan brukes med eller uten jobbnummer. Bruker du den uten jobbnummer, vil standardjobben gjenopptas. Prosessen kjører fortsatt i bakgrunnen. Du kan ikke sende input til den.
Hvis vi utfører «bg» kommandoen, vil ping-kommandoen gjenopptas:
bg
Ping-kommandoen gjenopptas, og vi ser igjen utskriften rulle i terminalen. Navnet på kommandoen som ble gjenopptatt vises i terminalen. Dette er uthevet i skjermbildet.
Men vi har et problem. Oppgaven kjører i bakgrunnen og godtar ikke input. Så hvordan stopper vi den? Ctrl+C gjør ingenting. Vi ser inputen vi skriver, men bakgrunnsoppgaven mottar ikke disse tastetrykkene. Den fortsetter bare å pinge.
Vi er nå i en blandet modus. Vi kan skrive i terminalen, men utskriften fra ping-kommandoen overskriver den raskt. Alt vi skriver blir utført i forgrunnen.
For å stoppe bakgrunnsoppgaven, må vi bringe den til forgrunnen og deretter stoppe den.
Kommandoen «fg»
Kommandoen «fg» bringer en bakgrunnsoppgave til forgrunnen. I likhet med «bg»-kommandoen kan den brukes med eller uten jobbnummer. Med et jobbnummer vil den operere på den spesifikke jobben. Uten jobbnummer vil den operere på den sist sendte bakgrunnsoppgaven.
Hvis vi skriver «fg», vil ping-kommandoen vår komme til forgrunnen. Inputen vi skriver blandes med utdataene fra ping-kommandoen, men den vil opereres av skallet som om den hadde blitt skrevet inn på kommandolinjen. Fra Bash-skallets ståsted er det nettopp det som har skjedd.
fg
Nå som ping-kommandoen igjen kjører i forgrunnen, kan vi bruke Ctrl+C for å stoppe den.
Ctrl+C
Å sende de rette signalene
Eksemplet vårt var litt rotete. Å kjøre prosesser i bakgrunnen er mest praktisk når prosessen ikke produserer output og ikke krever input.
Til tross for rotet, klarte vi følgende:
- Å sette en prosess i bakgrunnen.
- Å gjenopprette prosessen i en kjørende tilstand i bakgrunnen.
- Å returnere prosessen til forgrunnen.
- Å avslutte prosessen.
Når du bruker Ctrl+C og Ctrl+Z, sender du signaler til prosessen. Dette er forkortede måter for å bruke «kill»-kommandoen. Det er 64 forskjellige signaler som «kill» kan sende. Bruk «kill -l» i kommandolinjen for å se dem. «kill» er ikke den eneste kilden til disse signalene; noen genereres automatisk av andre prosesser i systemet.
Her er noen av de mest brukte:
SIGHUP: Signal 1. Sendes automatisk til en prosess når terminalen den kjører i lukkes.
SIGINT: Signal 2. Sendes til en prosess når du trykker Ctrl+C. Prosessen avbrytes og mottar beskjed om å avslutte.
SIGQUIT: Signal 3. Sendes til en prosess hvis brukeren sender et avslutningssignal med Ctrl+D.
SIGKILL: Signal 9. Prosessen avsluttes umiddelbart og vil ikke forsøke en ryddig avslutning. Prosessen avsluttes ikke elegant.
SIGTERM: Signal 15. Dette er standardsignalet sendt av «kill»-kommandoen. Det er standard signal for prosessavslutning.
SIGTSTP: Signal 20. Sendes til en prosess når du bruker Ctrl+Z. Det stopper prosessen og setter den i bakgrunnen.
Vi må bruke «kill»-kommandoen for å sende signaler som ikke har dedikerte tastekombinasjoner.
Ytterligere kontroll av jobber
En prosess som er flyttet til bakgrunnen ved bruk av Ctrl+Z, er satt i stoppet tilstand. Vi må bruke «bg»-kommandoen for å gjenoppta den. Det er enkelt å starte et program som en kjørende bakgrunnsprosess: legg til et ampersand-tegn «&» på slutten av kommandolinjen.
Selv om det er best at bakgrunnsprosesser ikke skriver til terminalvinduet, vil vi bruke eksempler som gjør det for å ha noe å referere til i skjermbildene. Denne kommandoen vil starte en endeløs løkke som en bakgrunnsprosess:
while true; do echo «How-To Geek Loop Process»; sleep 3; done &
Vi blir informert om jobbnummeret og prosess-ID-en til prosessen. Jobbnummeret vårt er 1 og prosess-IDen er 1979. Vi kan bruke disse for å kontrollere prosessen.
Utdatak fra vår endeløse løkke vil begynne å vises i terminalen. Som før kan vi bruke kommandolinjen, men alle kommandoer vi skriver vil bli blandet med output fra løkkeprosessen.
ls
For å stoppe prosessen kan vi bruke «jobs» for å finne jobbnummeret, og deretter bruke «kill».
Kommandoen «jobs» forteller oss at prosessen er jobbnummer 1. For å bruke det tallet med «kill», må vi sette et prosenttegn «%» foran.
jobs
kill %1
«kill» sender SIGTERM-signalet, signalnummer 15, til prosessen, som deretter avsluttes. Når Enter-tasten trykkes neste gang, vises en status for jobben. Den viser prosessen som «avsluttet». Hvis prosessen ikke reagerer på «kill»-kommandoen, kan du eskalere det og bruke «kill» med SIGKILL, signalnummer 9. Bare sett tallet 9 mellom «kill»-kommandoen og jobbnummeret.
kill 9 %1
Oppsummering
Ctrl+C: Sender SIGINT, signal 2, til prosessen – hvis den godtar input – og ber den om å avslutte.
Ctrl+D: Sender SIGQUIT, signal 3, til prosessen – hvis den godtar input – og ber den om å avslutte.
Ctrl+Z: Sender SIGSTP, signal 20, til prosessen og ber den om å stoppe (suspendere) og bli en bakgrunnsprosess.
jobs: Viser bakgrunnsjobbene og deres jobbnumre.
bg job_number: Starter en bakgrunnsprosess på nytt. Hvis du ikke oppgir et jobbnummer, brukes den sist sendte bakgrunnsoppgaven.
fg job_number: Bringer en bakgrunnsprosess til forgrunnen og starter den på nytt. Hvis du ikke oppgir et jobbnummer, brukes den sist sendte bakgrunnsoppgaven.
kommandolinje &: Hvis du legger til et ampersand-tegn & på slutten av en kommandolinje, vil kommandoen utføres som en bakgrunnsoppgave som kjører.
kill %job_number: Sender SIGTERM, signal 15, til prosessen for å avslutte den.
kill 9 %job_number: Sender SIGKILL, signal 9, til prosessen og avslutter den umiddelbart.