Sådan kører og kontrollerer du baggrundsprocesser på Linux

Brug Bash-skallen i Linux til at administrere forgrunds- og baggrundsprocesser. Du kan bruge Bashs jobkontrolfunktioner og signaler til at give dig mere fleksibilitet i, hvordan du kører kommandoer. Vi viser dig hvordan.

Alt om processer

Når et program køres i et Linux- eller Unix-lignende operativsystem, startes en proces. “Process” er navnet på den interne repræsentation af det kørende program i computerens hukommelse. Der er en proces for hvert aktivt program. Faktisk er der en proces for næsten alt, der kører på din computer. Det inkluderer komponenterne i din grafisk skrivebordsmiljø (GDE) som f.eks GNOME eller KDE, og system dæmoner der lanceres ved opstart.

Hvorfor næsten alt, der kører? Nå, Bash indbyggede som f.eks cd, pwd, og alias behøver ikke at have en proces lanceret (eller “spawned”), når de køres. Bash udfører disse kommandoer i den forekomst af Bash-skallen, der kører i dit terminalvindue. Disse kommandoer er hurtige, netop fordi de ikke behøver at have en proces startet for at de kan udføre. (Du kan skrive hjælp i et terminalvindue for at se listen over indbyggede Bash-ins.)

Processer kan køre i forgrunden, i hvilket tilfælde de overtager din terminal, indtil de er færdige, eller de kan køres i baggrunden. Processer, der kører i baggrunden, dominerer ikke terminalvinduet, og du kan fortsætte med at arbejde i det. Eller i det mindste dominerer de ikke terminalvinduet, hvis de ikke genererer skærmoutput.

Et rodet eksempel

Vi starter en simpel ping spor løb. Vi kommer til at pinge How-To Geek-domænet. Dette vil udføres som en forgrundsproces.

ping www.wdzwdz.com

Vi får de forventede resultater ved at rulle ned i terminalvinduet. Vi kan ikke gøre andet i terminalvinduet, mens ping kører. Tryk på Ctrl+C for at afslutte kommandoen.

Ctrl+C

Den synlige effekt af Ctrl+C er fremhævet på skærmbilledet. ping giver en kort oversigt og stopper derefter.

Lad os gentage det. Men denne gang vil vi trykke på Ctrl+Z i stedet for Ctrl+C. Opgaven vil ikke blive afsluttet. Det bliver en baggrundsopgave. Vi får kontrollen over terminalvinduet tilbage til os.

ping www.wdzwdz.com
Ctrl+Z

Den synlige effekt af at trykke på Ctrl+Z er fremhævet på skærmbilledet.

Denne gang får vi at vide, at processen er stoppet. Stoppet betyder ikke opsagt. Det er som en bil ved et stopskilt. Vi har ikke skrottet det og smidt det væk. Den er stadig på vejen, stillestående og venter på at gå. Processen er nu et baggrundsjob.

  Sådan bruger du Dropbox på Linux

Jobkommandoen vil liste jobs der er startet i den aktuelle terminalsession. Og fordi job (uundgåeligt) er processer, kan vi også bruge kommandoen ps til at se dem. Lad os bruge begge kommandoer og sammenligne deres output. Vi bruger muligheden T (terminal) til kun at vise de processer, der kører i dette terminalvindue. Bemærk, at der ikke er behov for at bruge en bindestreg – med T-indstillingen.

jobs
ps T

Jobkommandoen fortæller os:

[1]: Tallet i firkantede parenteser er jobnummeret. Vi kan bruge dette til at referere til jobbet, når vi skal styre det med jobkontrolkommandoer.
+: Plustegnet + viser, at det er det job, der vil blive reageret på, hvis vi bruger en jobkontrolkommando uden et specifikt jobnummer. Det kaldes standardjobbet. Standardjobbet er altid det, der senest er tilføjet til listen over job.
Stoppet: Processen kører ikke.
ping www.wdzwdz.com: Kommandolinjen, der startede processen.

ps kommandoen fortæller os:

PID: Processens proces-id. Hver proces har et unikt ID.
TTY: Pseudo-teletypen (terminalvindue), som processen blev udført fra.
STAT: Status for processen.
TID: Mængden af ​​CPU-tid, der forbruges af processen.
COMMAND: Kommandoen, der startede processen.

Disse er almindelige værdier for STAT-kolonnen:

D: Uafbrydelig søvn. Processen er i ventetilstand og venter normalt på input eller output og kan ikke afbrydes.
I: Tomgang.
R: Løber.
S: Afbrydelig søvn.
T: Stoppet af et jobkontrolsignal.
Z: En zombieproces. Processen er blevet afsluttet, men er ikke blevet “renset ned” af dens overordnede proces.

Værdien i STAT-kolonnen kan efterfølges af en af ​​disse ekstra indikatorer:

<: 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 af Ss. Det store “S” fortæller os, at Bash-skallen sover, og den er afbrydelig. Så snart vi har brug for det, vil det reagere. Det små “s” fortæller os, at skallen er en sessionsleder.

Ping-kommandoen har tilstanden T. Dette fortæller os, at ping er blevet stoppet af et jobkontrolsignal. I dette eksempel var det Ctrl+Z, vi brugte til at sætte det i baggrunden.

ps T-kommandoen har tilstanden R, som står for kører. + angiver, at denne proces er medlem af forgrundsgruppen. Så ps T-kommandoen kører i forgrunden.

bg kommandoen

Kommandoen bg bruges til at genoptage en baggrundsproces. Den kan bruges med eller uden jobnummer. Hvis du bruger det uden et jobnummer, bringes standardjobbet i forgrunden. Processen kører stadig i baggrunden. Du kan ikke sende noget input til det.

Hvis vi udsteder bg-kommandoen, genoptager vi vores ping-kommando:

bg

Ping-kommandoen genoptages, og vi ser rulleoutputtet i terminalvinduet igen. Navnet på den kommando, der er blevet genstartet, vises for dig. Dette er fremhævet på skærmbilledet.

  Sådan installeres Matcha-temaet på Linux

Men vi har et problem. Opgaven kører i baggrunden og accepterer ikke input. Så hvordan stopper vi det? Ctrl+C gør ikke noget. Vi kan se det, når vi skriver det, men baggrundsopgaven modtager ikke disse tastetryk, så den bliver ved med at pinge lystigt væk.

Faktisk er vi nu i en mærkelig blandet tilstand. Vi kan skrive i terminalvinduet, men det, vi skriver, bliver hurtigt fejet væk af det rullende output fra ping-kommandoen. Alt, hvad vi skriver, træder i kraft i forgrunden.

For at stoppe vores baggrundsopgave skal vi bringe den i forgrunden og derefter stoppe den.

fg kommandoen

Kommandoen fg vil bringe en baggrundsopgave i forgrunden. Ligesom bg-kommandoen kan den bruges med eller uden et jobnummer. At bruge det med et jobnummer betyder, at det fungerer på et bestemt job. Hvis det bruges uden et jobnummer, bruges den sidste kommando, der blev sendt til baggrunden.

Hvis vi skriver fg, vil vores ping-kommando blive bragt i forgrunden. De tegn, vi skriver, er blandet sammen med outputtet fra ping-kommandoen, men de betjenes af skallen, som om de var blevet indtastet på kommandolinjen som normalt. Og faktisk, set fra Bash-skallens synspunkt, er det præcis, hvad der er sket.

fg

Og nu hvor vi har ping-kommandoen kørende i forgrunden igen, kan vi bruge Ctrl+C til at dræbe den.

Ctrl+C

Vi skal sende de rigtige signaler

Det var ikke ligefrem kønt. At køre en proces i baggrunden fungerer åbenbart bedst, når processen ikke producerer output og ikke kræver input.

Men, rodet eller ej, vores eksempel opnåede:

At sætte en proces i baggrunden.
Gendannelse af processen til en kørende tilstand i baggrunden.
At vende processen tilbage i forgrunden.
Afslutning af processen.

Når du bruger Ctrl+C og Ctrl+Z , sender du signaler til processen. Disse er stenografiske måder at bruge kill-kommandoen. Der er 64 forskellige signaler at dræbe kan sende. Brug kill -l på kommandolinjen for at liste dem. drab er ikke den eneste kilde til disse signaler. Nogle af dem hæves automatisk af andre processer i systemet

Her er nogle af de mest brugte.

SIGHUP: Signal 1. Sendes automatisk til en proces, når terminalen den kører i lukkes.
SIGINT: Signal 2. Sendt til en proces du trykker på Ctrl+C. Processen afbrydes og får besked på at afslutte.
SIGQUIT: Signal 3. Sendes til en proces, hvis brugeren sender et afslutningssignal Ctrl+D.
SIGKILL: Signal 9. Processen afbrydes øjeblikkeligt og vil ikke forsøge at lukke ned rent. Processen går ikke yndefuldt ned.
SIGTERM: Signal 15. Dette er standardsignalet sendt af kill. Det er standard programafslutningssignal.
SIGTSTP: Signal 20. Sendt til en proces, når du bruger Ctrl+Z. Det stopper processen og sætter den i baggrunden.

  Sådan aktiveres HiDPi-skalering på Linux

Vi skal bruge kill-kommandoen til at udsende signaler, der ikke har tastekombinationer tildelt dem.

Yderligere jobkontrol

En proces flyttet til baggrunden ved at bruge Ctrl+Z placeres i standset tilstand. Vi skal bruge bg-kommandoen for at starte den kørende igen. Det er enkelt at starte et program som en kørende baggrundsproces. Tilføj et og-tegn & til slutningen af ​​kommandolinjen.

Selvom det er bedst, at baggrundsprocesser ikke skriver til terminalvinduet, vil vi bruge eksempler, der gør det. Vi skal have noget i skærmbillederne, som vi kan henvise til. Denne kommando starter en endeløs løkke som en baggrundsproces:

mens sandt; gør ekko “How-To Geek Loop Process”; søvn 3; Færdig &

mens sandt;  gøre ekko

Vi får at vide processens jobnummer og proces-id. Vores jobnummer er 1, og proces-id’et er 1979. Vi kan bruge disse identifikatorer til at styre processen.

Outputtet fra vores endeløse loop begynder at dukke op i terminalvinduet. Som før kan vi bruge kommandolinjen, men alle kommandoer, vi udsteder, er blandet med output fra loop-processen.

ls

For at stoppe vores proces kan vi bruge job til at minde os selv om, hvad jobnummeret er, og derefter bruge kill.

jobs rapporterer, at vores proces er job nummer 1. For at bruge det tal med kill, skal vi foran det med et procenttegn %.

jobs
kill %1

kill sender SIGTERM-signalet, signal nummer 15, til processen og den afsluttes. Næste gang der trykkes på Enter-tasten, vises en status for jobbet. Det angiver processen som “afsluttet”. Hvis processen ikke reagerer på dræb-kommandoen, kan du tage den et hak op. Brug kill med SIGKILL , signal nummer 9. Sæt blot tallet 9 mellem kill-kommandoen jobnummeret.

kill 9 %1

Ting vi har dækket

Ctrl+C: Sender SIGINT, signal 2, til processen – hvis den accepterer input – og beder den afsluttes.
Ctrl+D: Sender SISQUIT, signal 3, til processen – hvis den accepterer input – og beder den afslutte.
Ctrl+Z: Sender SIGSTP, signal 20, til processen og beder den stoppe (suspendere) og blive en baggrundsproces.
job: Viser baggrundsjob og viser deres jobnummer.
bg job_number: Genstarter en baggrundsproces. Hvis du ikke angiver et jobnummer, bruges den sidste proces, der blev omdannet til en baggrundsopgave.
fg job_number: bringer en baggrundsproces i forgrunden og genstarter den. Hvis du ikke angiver et jobnummer, bruges den sidste proces, der blev omdannet til en baggrundsopgave.
kommandolinje &: Tilføjelse af et og-tegn & til slutningen af ​​en kommandolinje udfører den kommando som en baggrundsopgave, der kører.
kill %job_number: Sender SIGTERM, signal 15, til processen for at afslutte det.
kill 9 %job_number: Sender SIGKILL, signal 9, til processen og afslutter den brat.