Alla program, som är igång, kallas för processer. Dessa processer kan t.ex. vara fönstersystemet X eller olika systemprogram (demoner), som startas, när man startar datorn. Var process köres av någon särskild användare. Sådana processer, som sättes igång vid systemstart, körs vanligen av root eller nobody. Sådana processer, man själv startar i egenskap av vanlig användare, körs av den användare, man är inloggad som.
Man får styra alla processer, man själv har startat. Därtill får root styra samtliga processer i systemet inbegripet dem, som andra användare har satt igång. Processer kan styras och övervakas såväl genom flera olika program som genom några kommandon i skalet.
Sådana program, som igångsättes ifrån kommandoraden, startar i förgrunden. Detta gör, att man kan se programmets utdata och samverka med programkörningen. Emellertid förekommer tillfällen, då man hellre vill ha programmet till att köra utan att lägga beslag på terminalen. Detta benämnes att köra programmet i bakgrunden, och det kan man åstadkomma på flera olika sätt.
Första sättet att lägga en process i bakgrunden är att lägga till et-tecknet »&« efter programmets namn, när man startar det på kommandoraden. Antag t.ex., att vi skulle vilja använda amp, som är en mp3-spelare för kommandoraden, och låta den spela en hel katalog full med mp3-filer, men att vi behöver göra något annat på samma terminal. Följande kommando sätter då igång amp i bakgrunden och laddar samtliga mp3-filer i katalogen:
$ amp *.mp3 &Programmet kör som vanligt, men man får tillbaka prompten »$«.
Man kan även lägga en process i bakgrunden, när den redan är igång och kör. Först startar vi ett program. När det är igång och kör, trycker vi på Ctrl+z. Detta lägger processen i pausläge (suspenderar processen), så att den tillfälligt upphör med att köra. Det kan dock när som helst startas igen. Har man pausat ett program, så får man prompten tillbaka. Då kan man lägga programmet i bakgrunden genom att kommendera
$ bgNu kommer den tidigare pausade processen att starta igen, men denna gång i bakgrunden.
Om man behöver samverka med en process, som lagts i bakgrunden, så kan man få fram den i förgrunden igen. Har man bara en enda process i bakgrunden, kan man få fram den med följande kommando:
$ fgOm programmet inte har slutat köra, kommer det att att överta terminalen, och man får då inte tillbaka prompten. Ibland händer det, att något program avslutar körningen, medan det ligger i bakgrunden. I så fall visas ett meddelande i stil med följande:
[1]+ Done /bin/ls $LS_OPTIONSDetta talar om, att bakgrundsprocessen (i detta fall ls) har kört färdigt.
Det är möjligt att ha flera bakgrundsprocesser igång samtidigt. När detta inträffar, behöver man veta vilka processer, man skall hämta fram till förgrunden. Att enbart slå fg skulle hämta fram den process, som sist lades i bakgrunden. Men tänk, om man nu skulle ha en hel lista med processer i bakgrunden? Lyckligtvis innehåller bash ett kommando för att förteckna alla processer. Det heter jobs och ger en utmatning som denna:
$ jobs [1] Stopped vim [2]- Stopped amp [3]+ Stopped man psDetta visar en lista över alla processer, som skjutits i bakgrunden. Som synes är samtliga stannade. Detta innebär, att processerna är suspenderade (pausade). Siffran före är en sorts ID för bakgrundsprocesser. Ett sådant ID med plustecken framför (man ps) betecknar den process, som skall läggas i förgrunden, om man kommenderar enbart fg.
Om man vill hämta fram vim till förgrunden, så kan man skriva:
$ fg 1så far vim upp på skärmen. Det kan vara mycket användbart att lägga processer i bakgrunden, när man har endast en terminal öppen över en uppringd förbindelse. Man kan på så vis ha flera program igång samtidigt på denna enda terminal, medan man då och då växlar fram och tillbaka mellan dem.
Nu vet vi alltså, hur vi skall kunna växla fram och tillbaka mellan flera processer, som vi har startat på kommandoraden. Vi vet också, att mängder av processer är igång samtidigt. Hur skall man då kunna få se en förteckning över alla dessa program? Det gör man med kommandot ps(1). Detta kommando har många växlar, så att vi bara skall behandla de viktigaste här. En fullständig förteckning finns på manualsidan för ps. Manualsidor behandlas ingående i avsnittet om man på s. i kapitel 2.
Genom att enbart kommendera ps får man en lista över program, som kör på terminalen. Ofta är detta en mycket kort lista:
$ ps PID TTY TIME CMD 7923 ttyp0 00:00:00 bash 8059 ttyp0 00:00:00 psÄven om detta inte är så många processer, så är informationen typisk. Man får samma kolumner, då man använder ps, oavsett hur många processer, som är igång. Vad betyder då detta?
PID står för process-ID. Alla processer, som är igång, får ett unikt identifieringsnummer. Med linuxkärnor i 2.2.x-serien kan detta PID vara vad som helst emellan 1 och 32767. Var process tilldelas nästa lediga PID. När en process avslutas (eller dödas, såsom vi skall få se i nästa avsnitt), kommer nästa lediga nummer att gå tillbaka till det lägsta lediga numret. Detta skall sannolikt ändras i den kommande 2.4-serien av linuxkärnan och införandet av 32-bit-PID.
Kolumnen TTY visar vilken terminal, processen kör på. Ett enkelt ps visar endast en lista över program, som kör på aktuell terminal, så att alla processer ger samma information i TTY-kolumnen. Som synes köres bägge de här förtecknade processerna på ttyp0. Detta visar, att de endera kör på en fjärrdator eller på en X-terminal av något slag.
Kolumnen TIME visar, hur mycket CPU-tid (processortid), processen har tillryggalagt. Denna avviker ifrån den verkliga tid, processen har varit igång. Man påminner sig, att Linux är ett operativsystem, som kan köra flera program samtidigt. Hela tiden är många processer igång och dessa processer får vardera en liten del av processortiden. Därför bör kolumnen TIME visa mycket mindre tid för var process, än den verkligen har hållit på att köra. Om man ser mer än några minuter i kolumnen TIME, betyder det, att någonting är i olag.
Slutligen visar kolumnen CMD vad programmet egentligen är för något. Denna kolumn förtecknar endast programmets namn, inga växlar eller dylika upplysningar. För att få sådana upplysningar måste vi använda en av de många flaggor, som hör till ps. Vi skall snart diskutera detta.
Man kan få en fullständig förteckning över processer, som är igång i systemet, om man använder en lämplig uppsättning växlar. Det kommer förmodligen att utmynna i en lång lista över processer (femtiofem i vår egen bärbara, medan vi skriver denna mening), så att vi förkortar återgivandet av utmatningen:
$ ps -ax PID TTY STAT TIME COMMAND 1 ? S 0:03 init [3] 2 ? SW 0:13 [kflushd] 3 ? SW 0:14 [kupdate] 4 ? SW 0:00 [kpiod] 5 ? SW 0:17 [kswapd] 11 ? S 0:00 /sbin/kerneld 30 ? SW 0:01 [cardmgr] 50 ? S 0:00 /sbin/rpc.portmap 54 ? S 0:00 /usr/sbin/syslogd 57 ? S 0:00 /usr/sbin/klogd -c 3 59 ? S 0:00 /usr/sbin/inetd 61 ? S 0:04 /usr/local/sbin/sshd 63 ? S 0:00 /usr/sbin/rpc.mountd 65 ? S 0:00 /usr/sbin/rpc.nfsd 67 ? S 0:00 /usr/sbin/crond -l10 69 ? S 0:00 /usr/sbin/atd -b 15 -l 1 77 ? S 0:00 /usr/sbin/apmd 79 ? S 0:01 gpm -m /dev/mouse -t ps2 94 ? S 0:00 /usr/sbin/automount /auto file /etc/auto.misc 106 tty1 S 0:08 -bash 108 tty3 SW 0:00 [agetty] 109 tty4 SW 0:00 [agetty] 110 tty5 SW 0:00 [agetty] 111 tty6 SW 0:00 [agetty] [utmatning avklippt]
Flertalet av dessa processer startas vid systemstart på de flesta maskiner. Vi har dock gjort några förändringar i vårt system, så att erfarenheterna härvidlag förmodligen går isär. Emellertid kan man se de flesta av dessa processer i vilket system som helst. Som synes visar dessa växlar även de körande processernas växlar. Vi får här också några fler kolumner och en del annan intressant utmatning.
För det första lägger man märke till, att de flesta av dessa processer uppges köra på en tty vid namn »?«. Detta är processer, som startats ifrån en numera icke längre aktiv terminal. Därför är de heller inte längre bundna till någon särskild terminal.
För det andra finns här en ny kolumn: STAT. Den visar processens status (tillstånd). S står för sovande (sleeping); processen väntar på, att någonting skall hända. Z står för zombieprocess. En zombieprocess är en process, vars förälder har dött, så att barnprocessen är övergiven. Detta är inte bra.
Om man vill ha ännu mer information om processer, som är igång, kan man försöka med detta kommando:
$ ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 344 80 ? S Mar02 0:03 init [3] root 2 0.0 0.0 0 0 ? SW Mar02 0:13 [kflushd] root 3 0.0 0.0 0 0 ? SW Mar02 0:14 [kupdate] root 4 0.0 0.0 0 0 ? SW Mar02 0:00 [kpiod] root 5 0.0 0.0 0 0 ? SW Mar02 0:17 [kswapd] root 11 0.0 0.0 1044 44 ? S Mar02 0:00 /sbin/kerneld root 30 0.0 0.0 1160 0 ? SW Mar02 0:01 [cardmgr] bin 50 0.0 0.0 1076 120 ? S Mar02 0:00 /sbin/rpc.port root 54 0.0 0.1 1360 192 ? S Mar02 0:00 /usr/sbin/sysl root 57 0.0 0.1 1276 152 ? S Mar02 0:00 /usr/sbin/klog root 59 0.0 0.0 1332 60 ? S Mar02 0:00 /usr/sbin/inet root 61 0.0 0.2 1540 312 ? S Mar02 0:04 /usr/local/sbi root 63 0.0 0.0 1796 72 ? S Mar02 0:00 /usr/sbin/rpc. root 65 0.0 0.0 1812 68 ? S Mar02 0:00 /usr/sbin/rpc. root 67 0.0 0.2 1172 260 ? S Mar02 0:00 /usr/sbin/cron root 77 0.0 0.2 1048 316 ? S Mar02 0:00 /usr/sbin/apmd root 79 0.0 0.1 1100 152 ? S Mar02 0:01 gpm root 94 0.0 0.2 1396 280 ? S Mar02 0:00 /usr/sbin/auto chris 106 0.0 0.5 1820 680 tty1 S Mar02 0:08 -bash root 108 0.0 0.0 1048 0 tty3 SW Mar02 0:00 [agetty] root 109 0.0 0.0 1048 0 tty4 SW Mar02 0:00 [agetty] root 110 0.0 0.0 1048 0 tty5 SW Mar02 0:00 [agetty] root 111 0.0 0.0 1048 0 tty6 SW Mar02 0:00 [agetty] [utmatning avklippt]
Här visas en hel mängd information. Här tillkommer upplysningar om vilken användare, som startat en process, hur stor andel av systemresurserna, en process använder (kolumnerna %CPU, %MEM, VSZ och RSS), samt vilket datum, processen har startats. Uppenbarligen är detta många upplysningar, som kan komma till nytta för en systemadministratör. Det visar en sak till: texten passerar skärmkanten, så att man inte ser allt. Det kan man lösa med flaggan -w.
Det är inte så vackert, men det fullgör sitt arbete. Vi har nu fått ut fullständiga listor över alla processer. Manualsidan för ps går på djupet med detta. Emellertid har vi här visat de mest omtyckta alternativen, som man oftast har anledning att ta i bruk.
Då och då händer det, att något program missköter sig, så att man måste tillrättavisa det. Det program, som brukas vid sådan maktutövning, heter kill(1), och det kan brukas vid hantering av processer på flera olika sätt. Det uppenbaraste sättet är bruket av kill till att döda någon process. Det behöver man göra, när ett program har skenat och slukar mängder av systemresurser, eller också när man bara är trött på, att det är igång och kör.
För att döda en process behöver man känna till dess PID eller dess namn. För att få tag i dess PID kan man använda kommandot ps, såsom det visats i föregående avsnitt. För att döda process nummer 4747, skulle man kunna kommendera följande:
$ kill 4747Lägg märke till, att man måste vara processens ägare för att få döda den. Detta är av säkerhetsskäl. Finge man döda processer, som andra startat, så skulle man kunna begå allehanda illdåd. Självfallet får root döda vilka som helst processer i systemet.
Det finns en annan avart av kommandot kill, som heter killall(1). Detta program gör precis det, som namnet säger: det dödar samtliga processer med ett visst namn. Om man skulle vilja döda alla vim-processer, som är igång, så skulle man kunna kommendera:
$ killall vimVilka som helst och samtliga vim-processer skulle dö. Om root gjorde detta, skulle alla användares vim-processer dö. Detta för tanken till ett intressant sätt att sparka ut samtliga (sig själv inberäknat) ur systemet:
# killall bash
Ibland räcker det inte med ett vanligt kill. Vissa processer vill inte dö med kill. Man får ta till en kraftigare form. Om det förhatliga PID 4747 inte hade svarat på vår kill-begäran, så skulle vi ha fått ta till följande:
$ kill -9 4747Detta skall nästan säkert döda process 4747. Man kan åstadkomma samma sak med killall. Detta sänder en annan signal till processen. Ett vanligt kill sänder signalen SIGTERM (terminate) till processen. Kommandot kill -9 sänder däremot signalen SIGKILL (kill) till processen. Det finns en hel lista över sådana signaler, som står till förfogande. Vi kan få se en sådan förteckning genom att kommendera följande:
$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWRTill kill måste man använda en siffra, medan namnet minus det inledande »SIG« kan användas till killall. Här följer ytterligare ett exempel:
$ killall -KILL vimSlutligen kan man använda kill till att starta om en process. Om man sänder en SIGHUP, så läser de flesta processer in sina inställningsfiler på nytt. Detta är till särskilt god hjälp, när man skall få systemprocesser att läsa in sina konfigureringsfiler efter det, att man har redigerat de senare.
Slutligen finns ett kommando, som man kan använda till att visa efter hand förnyade upplysningar om de processer, som är igång i systemet. Detta kommando heter top(1) och det startas på följande vis:
$ topDetta visar en fullskärm med information om processer, som är igång i systemet, liksom en del allmänna upplysningar om systemet. Däri ingår genomsnittlig belastning, antal processer, CPU-tillstånd och information om ledigt minne samt enskildheter om processerna såsom PID, användare, prioritet, CPU- och minnesanvändning, körtid och programnamn.
: Kommandot top visar information om
processer.
Det kallas top därför, att de CPU-intensivaste programmen visas överst. En intressant anmärkning är, att top står överst på de flesta inaktiva (och en del aktiva) system p.g.a. dess CPU-användning. Emellertid är top mycket användbart, när man skall avgöra, vilket program det är, som missköter sig och behöver dödas.
Detta kapitel har diskuterat, vad en process är, och hur man kan styra den. Häri ingår läggande av processer i bakgrunden och förgrunden såväl som bruk av ps, top, och kill för att hålla dem rättade i ledet. Man bör nu kunna avgöra vilka processer, som är igång i systemet, och hur man skall bli av med dem, om de upphör med att uppföra sig ordentligt.
Om goda kagor och torra kakor (»cookies«).
Om goda kagor och torra kakor (»cookies«).