Hvordan kjøre og kontrollere bakgrunnsprosesser på Linux

Et skallmiljø på en Linux-datamaskin.

Fatmawati Achmad Zaenuri/Shutterstock.com



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 HVOR , og system demoner som lanseres ved oppstart.





Hvorfor nesten alt som går? Vel, Bash innebygde som f.eks CD , pwd , og alias trenger ikke å ha en prosess lansert (eller skapt) 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 |_+_| i et terminalvindu for å se listen over innebygde Bash-moduler.)

Prosesser kan kjøres i forgrunnen, i så fall overtar de 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 |_+_| spor løping . Vi skal |_+_| How-To Geek-domenet. Dette vil utføres som en forgrunnsprosess.

help

Annonse

Vi får de forventede resultatene ved å rulle nedover i terminalvinduet. Vi kan ikke gjøre noe annet i terminalvinduet mens |_+_| løper. For å avslutte kommandoen, trykk |_+_|.



ping

Den synlige effekten av |_+_| er uthevet i skjermbildet. |_+_| gir en kort oppsummering og stopper så.

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

ping ping

Den synlige effekten av å trykke |_+_| 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 bakgrunn jobb .

Den |_+_| kommando vil liste opp jobbene som er startet i gjeldende terminaløkt. Og fordi jobber er (uunngåelig) prosesser, kan vi også bruke |_+_| kommando for å se dem. La oss bruke begge kommandoene og sammenligne utgangene deres. Vi bruker |_+_| alternativet (terminal) alternativet for kun å liste opp prosessene som kjører i dette terminalvinduet. Merk at det ikke er nødvendig å bruke en bindestrek |_+_| med |_+_| alternativ.

Ctrl+C Ctrl+C

Den |_+_| kommandoen forteller oss:

    [en]: 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 vil bli iverksatt 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.howtogeek.com: Kommandolinjen som startet prosessen.

Den |_+_| kommandoen forteller oss:

    PID: Prosess-ID-en 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. Jeg: Tomgang. R: Løping. S: Avbrytbar søvn. T: Stoppet av et jobbkontrollsignal. MED: En zombieprosess. Prosessen er avsluttet, men har ikke blitt renset av den overordnede prosessen.
Annonse

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

    <: Høyprioritert oppgave (ikke hyggelig for andre prosesser). N: Lav prioritet (hyggelig med andre prosesser). L: prosessen har sider låst i minnet (brukes vanligvis av sanntidsprosesser). s: En øktleder. En sesjonsleder er en prosess som har lansert prosessgrupper. Et skall er en øktleder. L: Flertrådsprosess. +: En forgrunnsprosess.

Vi kan se at Bash har tilstanden |_+_|. Den store bokstaven S forteller oss at Bash-skallet sover, og det er avbrytbart. Så snart vi trenger det, vil det svare. Den lille bokstaven s forteller oss at skallet er en øktleder.

Ping-kommandoen har tilstanden |_+_|. Dette forteller oss at |_+_| har blitt stoppet av et jobbkontrollsignal. I dette eksemplet var det |_+_| vi pleide å sette det i bakgrunnen.

Den |_+_| kommandoen har tilstanden |_+_|, som står for kjører. Den |_+_| indikerer at denne prosessen er medlem av forgrunnsgruppen. Så |_+_| kommandoen kjører i forgrunnen.

bg-kommandoen

Den |_+_| 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 |_+_| kommando, vil vi gjenoppta vår |_+_| kommando:

ping

Annonse

Den |_+_| 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.

gjenopptatt ping bakgrunnsprosess med utdata i en terminal enke

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

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 |_+_| kommando. 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

Den |_+_| kommandoen vil bringe en bakgrunnsoppgave i forgrunnen. Akkurat som |_+_| kommando, 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 |_+_| vår |_+_| kommandoen vil bli brakt i forgrunnen. Tegnene vi skriver er blandet sammen med utdataene fra |_+_| kommando, 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.

Ctrl+Z

Annonse

Og nå som vi har |_+_| kommandoen kjører i forgrunnen en gang til, kan vi bruke |_+_| å 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 |_+_| og |_+_| , sender du signaler til prosessen. Disse er stenografiske måter for å bruke |_+_| kommando. Det er 64 forskjellige signaler at |_+_| kan sende. Bruk |_+_| på kommandolinjen for å vise dem. |_+_| 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 traff |_+_|. Prosessen avbrytes og får beskjed om å avslutte. SÅ MYE: Signal 3. Sendt til en prosess hvis brukeren sender et sluttsignal |_+_|. 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 |_+_|. Det er standard programavslutningssignal. SIGTSTP: Signal 20. Sendt til en prosess når du bruker |_+_|. Den stopper prosessen og setter den i bakgrunnen.

Vi må bruke |_+_| kommando for å utstede signaler som ikke har tastekombinasjoner tilordnet.

Ytterligere jobbkontroll

En prosess flyttet til bakgrunnen ved å bruke |_+_| er plassert i stoppet tilstand. Vi må bruke |_+_| 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:

Annonse

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

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

utdata fra bakgrunnsløkkeprosessen ispedd utdata fra andre kommandoer

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

|_+_| rapporterer at prosessen vår er jobb nummer 1. For å bruke det nummeret med |_+_| vi må gå foran med et prosenttegn |_+_|.

Ctrl+Z jobs

I SLEKT: Hvordan Linux-signaler fungerer: SIGINT, SIGTERM og SIGKILL

|_+_| sender |_+_| signal, 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 svarer på |_+_| kommando kan du ta det opp et hakk. Bruk |_+_| med |_+_| , signal nummer 9. Bare sett tallet 9 mellom |_+_| beordre jobbnummeret.

ps

Ting vi har dekket

    Ctrl+C: Sender |_+_|, signal 2, til prosessen – hvis den godtar input – og ber den avsluttes. Ctrl+D: Sender |_+_|, signal 3, til prosessen—hvis den godtar input—og ber den avslutte. Ctrl+Z: Sender |_+_|, signal 20, til prosessen og ber den stoppe (suspendere) og bli en bakgrunnsprosess. arbeidsplasser: Viser bakgrunnsjobbene og viser jobbnummeret deres. bg Jobbnummer : Starter en bakgrunnsprosess på nytt. Hvis du ikke oppgir et jobbnummer, brukes den siste prosessen som ble omgjort til en bakgrunnsoppgave. fg Jobbnummer : 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 & : Legge til et og-tegn |_+_| til slutten av en kommandolinje utfører den kommandoen som en bakgrunnsoppgave, som kjører.
  • drepe % Jobbnummer : Sender |_+_|, signal 15, til prosessen for å avslutte den. drepe 9 % Jobbnummer : Sender |_+_|, signal 9, til prosessen og avslutter den brått.

I SLEKT: Hvordan drepe prosesser fra Linux-terminalen

Linux-kommandoer
Filer tjære · pv · katt · tac · chmod · grep · diff · sed · Med · Mann · pushd · popd · fsck · testdisk · seq · fd · pandoc · CD · $PATH · awk · bli med · jq · brette · unik · journalctl · hale · stat · ls · fstab · kastet ut · mindre · chgrp · chown · rev · se · strenger · type · endre navn · glidelås · pakke opp · montere · umount · installere · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · fra · ln · lapp · konvertere · rclone · makulere · SRM
Prosesser alias · skjerm · topp · hyggelig · renice · framgang · strace · system · tmux · chsh · historie · · parti · gratis · hvilken · dmesg · brukermod · ps · chroot · xargs · tty · rosa · lsof · vmstat · pause · vegg · ja · drepe · søvn · sudo · hans · tid · gruppeadd · brukermod · grupper · lshw · skru av · starte på nytt · Stoppe · strøm av · passwd · lscpu · crontab · Dato · bg · fg
Nettverk netstat · ping · traceroute · ip · ss · hvem er · fail2ban · bmon · du · finger · nmap · ftp · krølle · wget · hvem · hvem er jeg · I · iptables · ssh-keygen · ufw

I SLEKT: Beste Linux bærbare datamaskiner for utviklere og entusiaster

LES NESTE Profilbilde for Dave McKay Dave McKay
Dave McKay brukte først datamaskiner da stanset papirtape var på moten, og han har programmert siden. Etter over 30 år i IT-bransjen er han nå teknologijournalist på heltid. I løpet av sin karriere har han jobbet som frilansprogrammerer, leder for et internasjonalt programvareutviklingsteam, prosjektleder for IT-tjenester og sist som databeskyttelsesansvarlig. Hans forfatterskap har blitt publisert av howtogeek.com, cloudsavvyit.com, itenterpriser.com og opensource.com. Dave er en Linux-evangelist og forkjemper for åpen kildekode.
Les hele bio

Interessante Artikler