Introduktion till processer i bash

Varje kommando du skriver in i bash startar en egen process. När du skriver t.ex. ”ls” för att lista innehållet i en katalog startar bash en separat process för det och avslutar den sedan direkt när kommandot utförts. Oftast är det inget man behöver ägna någon särskild tankemöda då de flesta kommandon och script man anropar exekveras snabbare än man hinner reagera.  Förr eller senare kan det dock dyka upp kommandon eller script som antingen tar lång tid för att de behandlar en stor mängd data eller för att kommandot eller scriptet till sin natur bör köra under en längre tid, kanske för att samla in information om systemet medan det körs. Ett exempel på ett sådant kommando kan t.ex. vara:

# tail -f /var/log/httpd/error_log

Kommandot tail gör som du kanske vet inte mycket mer än att skriva ut de sista 10 raderna ur en textfil på skärmen. Med parametern -f (follow) fortsätter tail att bevaka filen (som i det här fallet är Apaches loggfil för felmeddelanden; /var/log/httpd/error_log) och skriver ut förändringar till skärmen direkt då de upptäcks. Således ett mycket användbart kommando för att bevaka filer som förändras kontinuerligt. Ett problem med ovanstående kommando är dock att då det fortsätter köra kommer vi inte kunna göra någonting annat förrän kommandot antingen avbryts av oss eller avslutar på naturlig väg. Ett sätt att lösa det på kan förstås vara att öppna en separat terminal för just den processen och sedan växla till den terminalen när vi vill se vad som händer i vår loggfil.

Att köra en process i bakgrunden

En annan metod är att låta processen köra i bakgrunden och endast ”lyfta fram” den till förgrunden då vi vill veta vad som händer. För att starta ett kommando i bakgrunden lägger vi bara till ett ”&”-tecken efter kommandot och eventuella parametrar:

# tail -f /var/log/httpd/error_log &

Resultatet blir precis som innan att vi kommer att se de tio sista raderna ur loggfilen listade. Ovanför dessa kommer vi dock nu att se något i stil med:

[1] 9868

Bash har nu skapat ett separat ”jobb” för vårt kommando och givit det ett identifikationsnummer , i det här fallet 1. Nästa siffra, 9868, är operativsystemets processid (pid). Siffrorna kommer förstås vara annorlunda på din dator. Vi har nu två nummer att använda för att identifiera vår process. Men var tog prompten vägen? Tryck på Enter ytterligare en gång för att flytta processen till bakgrunden och lyfta fram prompten till förgrunden.

Lista processer i bakgrunden med jobs och ps

Till synes är allting nu som tidigare, men vårt kommando ligger fortfarande och kör i bakgrunden. För att lista de jobb vi startat skriver vi kort och gott ”jobs”:

[root@anders-laptop anders]# jobs
[1]+ Kör tail -f /var/log/httpd/error_log &

För att se vilka processer som körs för närvarande använder vi kommandot ps (process status):

[root@anders-laptop ~]# ps
PID TTY TIME CMD
9693 pts/0 00:00:00 su
9698 pts/0 00:00:00 bash
9868 pts/0 00:00:00 tail
9877 pts/0 00:00:00 ps

Flytta processer med fg och bg

För att flytta fram en process till förgrunden använder vi kommandot fg följt av jobbnumret:

[root@anders-laptop anders]# fg 1
tail -f /var/log/httpd/error_log

En alternativ syntax för att göra samma sak är att använda ett procenttecken följt av jobbnumret. Kommandot ovan kan alltså lika väl skrivas ”%1″. Processen kommer nu upp och syns på skärmen. För att åter flytta processen till bakgrunden trycker vi [CTRL+Z] för att först stoppa processen (suspend). Sedan använder du kommandot bg för att starta upp processen i bakgrunden igen:

[root@anders-laptop anders]# bg 1
[1]+ tail -f /var/log/httpd/error_log &

Observera att om du endast har stoppat en enda process behöver du inte ange något jobbnummer.

Avsluta process med kill

En process som körs i förgrunden kan oftast avslutas med tangentkombinationen CTRL+C.  Vi kan när som helst välja att avsluta en process i bakgrunden genom kommandot kill. Det går bra att ange både jobbid eller processid som parameter. Standard är dock processid, och vill vi hellre ange jobbid gör vi det med prefixet %:

[root@anders-laptop ~]# kill 9868 #alternativt "kill %1"

Sammanfattning

Ovan är tänkt som en kortfattad introduktion till processhantering i bash. Vill du veta mer om hur processer fungerar i UNIX-miljö finns en bra introduktion på Wikipedia, samt förstås bash:s egna manual.

Kommentera