Processhantering
Processer och deras identitet
I Linux får varje process som startas ett eget process id, som kallas PID. Den första PID som skapas är PID 1 och är i princip alltid processen init.
För att se vilken den högsta PID vi kan skapa i systemet är, tittar vi i filen /proc/sys/kernel/pid_max :
$ cat /proc/sys/kernel/pid_max
4194304
Hantera processer
För att se vilka processer som är igång i systemet använder vi kommandot ps. Det kan till exempel se ut så här:
$ ps
PID TTY TIME CMD
1447 pts/0 00:00:00 bash
18725 pts/0 00:00:00 ps
I exemplet ovanför ser vi att vi har två processer igång: bash och ps. Bash är den kommandotolk vi kör i systemet, kommandoraden. Ps är kommandot vi använde för att se vilka processer som vi har igång, ps är alltså också igång när vi kör kommandot. PID anger vilket id processen har, TTY är vilken terminal processen körs på, TIME anger hur länge processen körts och CMD anger vilket kommando som körs.
TIME anger inte hur länge en process har körts i klocktid, utan i CPU-tid. Alltså hur länge processen har använt processorn.
Kommandot ps aux visar alla processer som körs i systemet, av alla användare inklusive systemets egna processer.
Kommandot pstree visar processlistan i en trädstruktur och vi kan se vilken process som startat en annan. Kommandot pstree utan argument visar de processer som körs i vår terminal, vill vi se alla processer i systemet skriver vi pstree –a.
Kommandot top visar processerna interaktivt. För att avsluta top trycker vi på tangenten q. Vill vi ha färger och lite fler funktioner kan vi installera programmet htop:
$ sudo apt install htop
Starta sedan programmet genom att ange kommandot htop. Avsluta genom att trycka på tangenten q.
Kommandot pidof visar vilken PID en process har. Till exempel pidof bash. Kommandot används mest i skript där vi behöver veta om en process är igång eller inte.
Trevliga processer
Om vi vill starta en process med en annan prioritet än standard (0) använder vi kommandot nice. Kommandot nice gör att en process kan få företräde till processortid och vi bestämmer hur mycket, eller lite, företräde processen skall få genom att sätta nice till olika nivåer. Noll (0) är standard och ges till alla processer som startas. Därifrån kan vi ge processen högre prioritet genom att sätta nice till en lägre siffra, ner till -20 som är den högsta prioriteten vi kan ge en process. Vi ger processen en lägre prioritet genom att sätta en högre nice, upp till 19. Så -20 är högsta prioritet och 19 är lägsta. Noll (0) är standard. En process som har prioriteten 19 kommer enbart köras när ingen annan process i systemet vill använda processorn.
Om vi till exempel vill starta programmet top med den lägsta prioriteten (19) skriver vi:
$ nice -n 19 top
När vi tittar i kolumnen NI i top ser vi att processen körs som nice 19. Väljer vi en högre siffra (20 och uppåt) kommer processen få 19, som är den lägsta prioriteten vi kan ge en process. Värden under noll (0) kan vi inte sätta om vi inte är användaren root. Det lägsta värdet vi kan sätta är -20, försöker vi sätta ett lägre värde än så får vi automatiskt värdet -20. Om vi inte anger något värde till nice kommer processen få värdet 10:
$ nice top
Med kommandot renice kan vi ändra prioritet på befintliga processer, sådana som redan är igång i systemet. För att ändra prioritet på processen med PID 2664 från 0 till 4 skriver vi:
$ sudo renice -n 4 2664
2664 (process ID) old priority 0, new priority 4
Vi kan sätta nice på alla processer för en specifik användare genom att ange argumentet –u:
$ sudo renice -n 4 -u jonas
1000 (user ID) old priority 0, new priority 4
Här ändrar vi alla processer som tillhör användaren jonas till prioriteten 4 från att ha varit 0. Användaren root kan ändra prioritet på processer hur hon vill. En användare i systemet kan bara sänka sin prioritet. Om användaren sänker sin prioritet på sin process från 0 till 10 kommer hon bara kunna sänka den ännu mer (11, 12, …) men inte höja den (9, 8, …) även om processens prioritet var högre innan.
Bakgrundsprocesser
Om vi skall köra ett kommando som kommer ta tid kan vi välja att köra det programmet i bakgrunden. När vi startar ett program på kommandoraden lägger vi till & i slutet av kommandot för att köra det i bakgrunden, ett exempel:
$ dd if=/dev/zero of=zerofile.img bs=1 count=100000 &
[1] 28237
Där [1] anger vilket bakgrundsjobb det är och 28237 anger vilket process-id (PID) processen fick. Vi kan lista bakgrundsjobb med kommandot jobs.
För att ta fram jobbet igen använder vi kommandot fg. Om ett jobb har jobb-id 1 skriver vi fg 1. Har vi flera jobb igång väljer vi helt enkelt vilket jobb vi vill ta fram med kommandot fg genom att ange jobbets id: fg 3. Om vi redan har startat en process på kommandoraden och vi vill lägga det som ett bakgrundsjobb trycker vi på tangenterna CTRL och z samtidigt.
Då pausar vi processen och kan välja att fortsätta köra det som ett bakgrundsjobb med kommandot bg. Pausar vi flera processer väljer vi vilken process vi vill köra som bakgrundsjobb med kommandot bg och jobbets id, till exempel: bg 2. Om vi lagt ett jobb i bakgrunden med kommandot bg och vill avsluta det använder vi kommandot kill. Vi kan ta reda på processens PID och använda kommandot kill med PID:en, eller så anger vi vilket jobbnummer vi vill avsluta. Jobbnumret anges med ett procenttecken (%) och jobbnumret:
$ kill %1
Vill vi använda till exempel SIGKILL (-9) på jobbet skriver vi:
$ kill -9 %1
Att använda screen
Ibland är det användbart att starta ett program på en linuxmaskin och låta det fortsätta köras även när vi loggat ut från maskinen. Det enklaste sättet att lösa detta är med kommandot screen. Kommandot screen är inte installerat som standard, utan vi får börja med att installera det i systemet med hjälp av kommandot apt:
$ sudo apt install screen
För att starta ett program med screen börjar vi kommandoraden med screen och sedan kommandot vi vill köra:
$ screen top
[screen is terminating]
Vi startar top med screen. För att avsluta top trycker vi på q på tangentbordet. När vi avslutar top kommer också screen avslutas, eftersom vi startade top med screen.
Vi kan också starta screen utan att köra ett kommando, då skriver vi helt enkelt screen på kommandoraden:
$ screen

När vi startat en session med screen kan vi går ur screen, men fortfarande köra kommandot i systemet, genom att hålla inne tangenten CTRL och trycka på tangenten a och sedan på tangenten d för att komma ut till vår terminal igen. Vi kommer få en rad liknande denna på kommandoraden:
[detached from 28310.pts-1.ubuntu]
Vilket betyder att screen och alla kommandon vi kör i screen fortfarande körs i systemet. För att återansluta till sessionen skriver vi screen -r. När vi kör kommandon i screen kommer de fortsätta köras i systemet även om vi loggar ut från det. Detta är användbart när vi vill köra en längre process, men inte vill vara inloggade i systemet under tiden det körs. Med argumentet -list kan vi se alla screen som körs i systemet just nu:
$ screen -list
Det här är bara en bråkdel av vad kommandot screen klarar av att göra, för mer information läser vi manualsidan för kommandot: man screen.
Att använda tmux
Tmux används på samma sätt som screen. Det är mycket en smaksak vilken av screen och tmux man gillar. Till stora delar gör de samma sak.
För att köra tmux behöver vi installera paketet tmux:
$ sudo apt install tmux
Sedan kan vi starta tmux genom att skriva:
$ tmux

Kommandon till tmux ges genom att vi trycker på CTRL och bokstaven b samtidigt, C-b. Därefter anger vi kommandot vi vill ge. För att detacha vår tmux-session, så att vi kommer ut ur den men den fortfarande kör i bakgrunden använder vi C-b d. För att återansluta till sessionen skriver vi kommandot tmux attach.
Vi kan också skapa flera fönster i tmux (de syns i raden längst ned) genom att trycka C-b c (för create). Hoppar mellan fönster gör vi genom att använda C-b n (för next).
c-b t visar en klocka med aktuell tid.
Hur Linux hanterar processer
Vi kan skicka signaler till processer i Linux, signalerna är styrkommandon som processen kan fånga upp (beroende på om utvecklaren har skrivit programkod som lyssnar på dem) och vi använder dem ofta för att stänga ner processer, eller helt enkelt tvångsavsluta dem.
Det finns en mängd olika signaler vi kan använda, några av de vanligaste är:
- SIGTERM
-
Avslutar en process. Signalen ber processen stänga ner sig på ett korrekt sätt, precis som om vi hade valt att avsluta ett program.
- SIGKILL
-
som försöker avsluta processen utan att ta hänsyn till något alls. Processen får ingen möjlighet att stänga filer som är öppna, eller frigöra minne som den använt.
För att se alla signaler vi kan använda i Linux kan vi skriva kommandot man signal och manualsidan för kommandot kill har lite information också: man kill . För att skicka signaler kan vi använda kommandot kill:
$ kill PID
Om vi vill avsluta flera processer som heter samma sak, till exempel top kan vi använda kommandot killall. Med killall anger vi inte processernas PID, utan deras namn.
För att avsluta alla processer som heter top skriver vi:
$ killall top
Vi kan naturligtvis skicka andra signaler till processerna än standardsignalen SIGTERM genom att ange signalen till kommandot:
$ killall -9 top
Användaren root kan avsluta alla användares processer. En vanlig användare kan enbart avsluta sina egna processer. Om vi vill avsluta alla processer som körs av användaren jonas skriver vi:
$ killall -u jonas