Hvordan kjøre og kontrollere bakgrunnsprosesser på Linux

Bruk Bash-skallet i Linux for å administrere forgrunns- og bakgrunnsprosesser. Du kan bruke Bashs jobbkontrollfunksjoner og signaler for å gi deg mer fleksibilitet i hvordan du kjører kommandoer. Vi viser deg hvordan.

Alt om prosesser

Hver gang et program kjøres i et Linux- eller Unix-lignende operativsystem, startes en prosess. «Prosess» er navnet på den interne representasjonen av det kjørende programmet i datamaskinens minne. Det er en prosess for hvert aktivt program. Faktisk er det en prosess for nesten alt som kjører på datamaskinen din. Det inkluderer komponentene til din grafisk skrivebordsmiljø (GDE) som f.eks GNOME eller KDEog system demoner som lanseres ved oppstart.

Hvorfor nesten alt som kjører? Vel, Bash innebygde som f.eks cd, pwdog alias trenger ikke å ha en prosess lansert (eller «spawned») når de kjøres. Bash utfører disse kommandoene i forekomsten av Bash-skallet som kjører i terminalvinduet. Disse kommandoene er raske nettopp fordi de ikke trenger å ha en prosess startet for at de skal kunne utføres. (Du kan skrive hjelp i et terminalvindu for å se listen over innebygde Bash-moduler.)

Prosesser kan kjøres i forgrunnen, i så fall tar de over terminalen din til de er fullført, eller de kan kjøres i bakgrunnen. Prosesser som kjører i bakgrunnen dominerer ikke terminalvinduet, og du kan fortsette å jobbe i det. Eller i det minste dominerer de ikke terminalvinduet hvis de ikke genererer skjermutgang.

Et rotete eksempel

Vi starter en enkel ping spor løping. Vi skal pinge How-To Geek-domenet. Dette vil utføres som en forgrunnsprosess.

ping www.wdzwdz.com

Vi får de forventede resultatene ved å rulle nedover i terminalvinduet. Vi kan ikke gjøre noe annet i terminalvinduet mens ping kjører. For å avslutte kommandoen, trykk Ctrl+C.

Ctrl+C

Den synlige effekten av Ctrl+C er uthevet i skjermbildet. ping gir en kort oppsummering og stopper så.

La oss gjenta det. Men denne gangen trykker vi Ctrl+Z i stedet for Ctrl+C. Oppgaven vil ikke bli avsluttet. Det blir en bakgrunnsoppgave. Vi får kontroll over terminalvinduet tilbake til oss.

ping www.wdzwdz.com
Ctrl+Z

Den synlige effekten av å trykke Ctrl+Z er uthevet i skjermbildet.

Denne gangen får vi beskjed om at prosessen er stoppet. Stoppet betyr ikke avsluttet. Det er som en bil ved et stoppskilt. Vi har ikke skrotet den og kastet den. Den er fortsatt på veien, stillestående og venter på å gå. Prosessen er nå en bakgrunnsjobb.

  Hvordan lage og installere SSH-nøkler fra Linux-skallet

Jobbene kommandoen vil liste opp jobbene som er startet i gjeldende terminaløkt. Og fordi jobber (uunngåelig) er prosesser, kan vi også bruke ps-kommandoen for å se dem. La oss bruke begge kommandoene og sammenligne utgangene deres. Vi bruker alternativet T-alternativet (terminal) for bare å liste opp prosessene som kjører i dette terminalvinduet. Merk at det ikke er nødvendig å bruke bindestrek – med T-alternativet.

jobs
ps T

Jobs-kommandoen forteller oss:

[1]: Tallet i hakeparentes er jobbnummeret. Vi kan bruke dette til å referere til jobben når vi trenger å kontrollere den med jobbkontrollkommandoer.
+: Plusstegnet + viser at dette er jobben det skal handles på hvis vi bruker en jobbkontrollkommando uten et spesifikt jobbnummer. Det kalles standardjobben. Standardjobben er alltid den som sist ble lagt til i listen over jobber.
Stoppet: Prosessen kjører ikke.
ping www.wdzwdz.com: Kommandolinjen som startet prosessen.

ps-kommandoen forteller oss:

PID: Prosess-IDen til prosessen. Hver prosess har en unik ID.
TTY: Pseudo-teletypen (terminalvinduet) som prosessen ble utført fra.
STAT: Status for prosessen.
TID: Mengden CPU-tid som forbrukes av prosessen.
KOMMANDO: Kommandoen som startet prosessen.

Dette er vanlige verdier for STAT-kolonnen:

D: Uavbrutt søvn. Prosessen er i ventetilstand, vanligvis venter på inndata eller utdata, og kan ikke avbrytes.
I: Inaktiv.
R: Løper.
S: Avbrytbar søvn.
T: Stoppet av et jobbkontrollsignal.
Z: En zombieprosess. Prosessen har blitt avsluttet, men har ikke blitt «ryddet ned» av den overordnede prosessen.

Verdien i STAT-kolonnen kan følges av en av disse ekstra indikatorene:

<: high-priority="" task="" nice="" to="" other="" processes="" n:="" low-priority="" l:="" process="" has="" pages="" locked="" into="" memory="" used="" by="" real-time="" s:="" a="" session="" leader.="" leader="" is="" that="" launched="" groups.="" shell="" multi-thread="" process.="" foreground="">Vi kan se at Bash har en tilstand av Ss. Den store «S» forteller oss at Bash-skallet sover, og det er avbrytbart. Så snart vi trenger det, vil det svare. Den små bokstaven «s» forteller oss at skallet er en øktleder.

Ping-kommandoen har tilstanden T. Dette forteller oss at ping har blitt stoppet av et jobbkontrollsignal. I dette eksemplet var det Ctrl+Z vi brukte for å sette den i bakgrunnen.

ps T-kommandoen har tilstanden R, som står for løping. + indikerer at denne prosessen er medlem av forgrunnsgruppen. Så ps T-kommandoen kjører i forgrunnen.

bg-kommandoen

bg-kommandoen brukes til å gjenoppta en bakgrunnsprosess. Den kan brukes med eller uten jobbnummer. Hvis du bruker den uten et jobbnummer, bringes standardjobben i forgrunnen. Prosessen kjører fortsatt i bakgrunnen. Du kan ikke sende noe input til den.

Hvis vi utsteder bg-kommandoen, vil vi gjenoppta ping-kommandoen vår:

bg

Ping-kommandoen gjenopptas og vi ser rulleutgangen i terminalvinduet igjen. Navnet på kommandoen som er startet på nytt vises for deg. Dette er uthevet i skjermbildet.

Men vi har et problem. Oppgaven kjører i bakgrunnen og godtar ikke inndata. Så hvordan stopper vi det? Ctrl+C gjør ingenting. Vi kan se det når vi skriver det, men bakgrunnsoppgaven mottar ikke disse tastetrykkene, så den fortsetter å pinge bort.

  Hvordan utføre en oppgave når en ny fil er lagt til en katalog i Linux

Faktisk er vi nå i en merkelig blandet modus. Vi kan skrive i terminalvinduet, men det vi skriver blir raskt feid bort av rulleutgangen fra ping-kommandoen. Alt vi skriver trer i kraft i forgrunnen.

For å stoppe bakgrunnsoppgaven vår må vi bringe den i forgrunnen og deretter stoppe den.

fg-kommandoen

Kommandoen fg vil bringe en bakgrunnsoppgave i forgrunnen. Akkurat som bg-kommandoen kan den brukes med eller uten jobbnummer. Å bruke den med et jobbnummer betyr at den vil fungere på en bestemt jobb. Hvis den brukes uten jobbnummer, brukes den siste kommandoen som ble sendt til bakgrunnen.

Hvis vi skriver fg vil ping-kommandoen vår bli brakt i forgrunnen. Tegnene vi skriver er blandet sammen med utdata fra ping-kommandoen, men de blir operert av skallet som om de hadde blitt lagt inn på kommandolinjen som vanlig. Og faktisk, fra Bash-skallets synspunkt, er det akkurat det som har skjedd.

fg

Og nå som vi har ping-kommandoen kjører i forgrunnen igjen, kan vi bruke Ctrl+C for å drepe den.

Ctrl+C

Vi må sende de riktige signalene

Det var ikke akkurat pent. Å kjøre en prosess i bakgrunnen fungerer tydeligvis best når prosessen ikke produserer utdata og ikke krever input.

Men, rotete eller ikke, vårt eksempel oppnådde:

Setter en prosess i bakgrunnen.
Gjenoppretter prosessen til en kjørende tilstand i bakgrunnen.
Returnerer prosessen til forgrunnen.
Avslutter prosessen.

Når du bruker Ctrl+C og Ctrl+Z, sender du signaler til prosessen. Disse er stenografiske måter å bruke kill-kommandoen. Det er 64 forskjellige signaler som dreper kan sende. Bruk kill -l på kommandolinjen for å liste dem. drep er ikke den eneste kilden til disse signalene. Noen av dem heves 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. Sendt til en prosess du trykker Ctrl+C. Prosessen avbrytes og får beskjed om å avslutte.
SIGQUIT: Signal 3. Sendes til en prosess hvis brukeren sender et avslutningssignal Ctrl+D.
SIGKILL: Signal 9. Prosessen avbrytes umiddelbart og vil ikke forsøke å lukke ned rent. Prosessen går ikke elegant ned.
SIGTERM: Signal 15. Dette er standardsignalet sendt av kill. Det er standard programavslutningssignal.
SIGTSTP: Signal 20. Sendt til en prosess når du bruker Ctrl+Z. Den stopper prosessen og setter den i bakgrunnen.

Vi må bruke kill-kommandoen til å utstede signaler som ikke har tastekombinasjoner tildelt dem.

  Hvordan installere og bruke Tor-nettleseren på Linux

Ytterligere jobbkontroll

En prosess flyttet inn i bakgrunnen ved å bruke Ctrl+Z plasseres i stoppet tilstand. Vi må bruke bg-kommandoen for å starte den på nytt. Det er enkelt å starte et program som en kjørende bakgrunnsprosess. Legg til et og-tegn & til slutten av kommandolinjen.

Selv om det er best at bakgrunnsprosesser ikke skriver til terminalvinduet, skal vi bruke eksempler som gjør det. Vi må ha noe i skjermbildene som vi kan referere til. Denne kommandoen vil starte en endeløs løkke som en bakgrunnsprosess:

mens sant; gjør ekko «How-To Geek Loop Process»; sove 3; ferdig &

mens sant;  gjør ekko

Vi blir fortalt jobbnummeret og prosess-ID-en til prosessen. Vårt jobbnummer er 1, og prosess-ID er 1979. Vi kan bruke disse identifikatorene til å kontrollere prosessen.

Utdataene fra vår endeløse løkke begynner å vises i terminalvinduet. Som før kan vi bruke kommandolinjen, men alle kommandoer vi utsteder er ispedd utdata fra løkkeprosessen.

ls

For å stoppe prosessen vår kan vi bruke jobber for å minne oss selv på hva jobbnummeret er, og deretter bruke kill.

jobs rapporterer at prosessen vår er jobb nummer 1. For å bruke det tallet med kill må vi foran det med et prosenttegn %.

jobs
kill %1

kill sender SIGTERM-signalet, signal nummer 15, til prosessen og den 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 ta den opp et hakk. Bruk kill med SIGKILL , signal nummer 9. Bare sett tallet 9 mellom kill-kommandoen jobbnummeret.

kill 9 %1

Ting vi har dekket

Ctrl+C: Sender SIGINT, signal 2, til prosessen – hvis den godtar input – og ber den avsluttes.
Ctrl+D: Sender SISQUIT, signal 3, til prosessen – hvis den godtar input – og ber den avslutte.
Ctrl+Z: Sender SIGSTP, signal 20, til prosessen og ber den stoppe (suspendere) og bli en bakgrunnsprosess.
jobber: Viser bakgrunnsjobbene og viser jobbnummeret deres.
bg job_number: Starter en bakgrunnsprosess på nytt. Hvis du ikke oppgir et jobbnummer, brukes den siste prosessen som ble omgjort til en bakgrunnsoppgave.
fg job_number: bringer en bakgrunnsprosess i forgrunnen og starter den på nytt. Hvis du ikke oppgir et jobbnummer, brukes den siste prosessen som ble omgjort til en bakgrunnsoppgave.
kommandolinje &: Hvis du legger til et og-tegn & på slutten av en kommandolinje, utføres den kommandoen 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 brått.