Noen ganger er det eneste alternativet å avslutte en prosess med tvang. Selv om det kan høres dramatisk ut, betyr det å «drepe» en prosess rett og slett å tvinge den til å stoppe. Her er hvordan du gjør det fra kommandolinjen i Linux eller macOS.
Hva er egentlig en prosess?
Prosesser er aktive programmer, som for eksempel nettleseren din, bakgrunnsprosesser knyttet til skrivebordsmiljøet og systemtjenester i Linux.
Vi kan dele prosesser i to hovedkategorier:
Forgrunnsprosesser er de som startes av en bruker, enten i et terminalvindu eller som et grafisk program. Bakgrunnsprosesser, derimot, kjører automatisk og krever ikke brukerinteraksjon. De venter ikke på input fra brukeren og presenterer heller ikke resultater direkte. Disse inkluderer tjenester og demoner.
For å illustrere: tenk på forgrunnsprosesser som de synlige skuespillerne på en scene, mens bakgrunnsprosesser er det usynlige crewet bak kulissene.
Når prosesser feiler eller oppfører seg merkelig, kan de bruke for mye prosessorkraft, sluke minne eller gå i evige løkker. Dette kan føre til at grafiske applikasjoner ikke svarer på museklikk, eller at terminalapplikasjoner aldri gir deg kontrollen tilbake.
Den nødvendige handlingen
Å «drepe» en prosess betyr altså å tvinge den til å avsluttes, noe som kan være nødvendig når prosessen ikke reagerer. Linux tilbyr kommandoene `kill`, `pkill` og `killall` for dette formålet. Disse kan brukes på alle typer prosesser, uansett om de er grafiske eller tekstbaserte, forgrunns- eller bakgrunnsprosesser.
`kill`-kommandoen
For å bruke `kill`, må du vite prosess-ID-en (PID) til prosessen du vil avslutte. Kommandoen `ps` hjelper deg med å finne denne PID-en.
For å se alle prosesser, bruk `ps -e` (alle prosesser). Det er lurt å filtrere utgangen via `less` fordi det fort kan bli mye. Skriv `ps -e | less` og trykk Enter.
ps -e | less
Dette gir deg en liste over prosesser. Du kan søke fremover ved å trykke `/`, og bakover med `?` i `less`.
For å finne den spesifikke prosessen du er ute etter, kan du sende utdataene fra `ps` gjennom `grep` og spesifisere (en del av) navnet på prosessen.
ps -e | grep shutter
Når du har funnet PID-en, gir du den som parameter til `kill`-kommandoen. For å avslutte prosessen `shutter` med PID `2099`, skriv:
kill 2099
`kill`-kommandoen gir ingen bekreftelse på at den har lyktes.
`pkill`-kommandoen
`pkill` lar deg avslutte prosesser ved navn, uten å trenge PID. Du gir et søkeord, og alle prosesser som matcher dette, blir avsluttet. Derfor er det viktig å være sikker på at du har stavet søkeordet riktig.
Som et forholdsregler kan du bruke `pgrep` før `pkill`. `pgrep` viser PID-ene til prosesser som matcher søkeordet. Dette er trygt, da det ikke sender noe `kill`-signal, og du unngår å ved et uhell avslutte feil prosess om du har skrevet feil. Begge kommandoene håndterer søkeord på samme måte og deler samme man-side.
La oss anta at det finnes en prosess som har «subq» i navnet. Vi bruker `ps -u dave | grep subq` for å bekrefte dette. Som du ser, matcher «subq» denne prosessen, og bare denne.
ps -u dave | grep subq
Anta at brukeren bare vet at prosessnavnet inneholder «subq». De bruker `pgrep` for å bekrefte at det bare er en match, og deretter `pkill`:
pgrep subq
pkill subq
Du kan bruke `pkill` til å avslutte flere prosesser samtidig. Her bruker vi `pgrep` for å se hvor mange Chrome-prosesser som er startet, og deretter `pkill` for å avslutte alle. Vi sjekker til slutt med `pgrep` at alle er fjernet.
pgrep chrome
pkill chrome
pgrep chrome
Hvis det kjører flere prosesser med samme navn, men du ikke vil avslutte alle, kan du bruke `pgrep` med `-f` (kommandolinje) for å identifisere dem. Et eksempel kan være to `ping`-prosesser, der du bare vil avslutte en. Bruk kommandolinjeparametrene for å skille dem. Husk anførselstegnene.
pgrep -f "ping 192.168.4.22"
pkill -f "ping 192.168.4.22"
`killall`-kommandoen
Advarsel: I Solaris og OpenIndiana vil `killall` avslutte alle prosesser som tilhører deg! Hvis du er root eller bruker `sudo killall`, vil du restarte maskinen! Dette ble bekreftet i OpenIndiana Hipster 2018.10.
`killall` ligner på `pkill`, men med en viktig forskjell: du må oppgi det *nøyaktige* prosessnavnet, ikke et søkeord.
Delvis matching er ikke tillatt; du må oppgi hele prosessnavnet, som dette:
killall shutt
killall shutter
Med `-y` (yngre enn) kan du avslutte prosesser som har kjørt i mindre enn en viss periode. Enhetene for perioden er:
s (sekunder)
m (minutter)
t (timer)
d (dager)
w (uker)
M (måneder – merk stor M)
y (år)
For å avslutte en prosess kalt `ana` som nylig startet, men la eldre instanser av `ana` kjøre, bruker du følgende: (hvis du reagerte innen to minutter):
killall -y 2m ana
`-o` (eldre enn) lar deg avslutte prosesser som har kjørt lengre enn en viss periode. Denne kommandoen vil f.eks. avslutte alle ssh-forbindelser som har vart i over en dag:
killall -o 1d sshd
Bruk med forsiktighet
Disse kommandoene lar deg nøyaktig og sikkert identifisere og avslutte prosesser som oppfører seg dårlig.
Vær alltid forsiktig. Kontroller at prosessen du er i ferd med å avslutte virkelig er den rette, og dobbeltsjekk. Først når du er sikker, kan du gå videre og avslutte prosessen.