Hoppa yfir í efnið

Kerfið og ferli

Linux er hannað til að gera marga hluti í einu. Á hverri sekúndu geta tugir eða hundruð forrita verið í gangi: skelin þín, þjónustur, ritlar, bakgrunnsverkefni og kerfishlutar. Í þessum hluta ætlum við að læra hvernig við fylgjumst með þessu lífi.

Hvað er ferli?

Þegar þú biður skelina um að keyra forrit á borð við ls býr stýrikerfið sjálfkrafa til ferli (e. process). Við getum hugsað um forritið sjálft eins og uppskrift í bók, en ferlið er uppskriftin í sjálfri keyrslunni.

Sérhvert ferli fær sitt eigið PID (e. Process ID) sem virkar sem einstök kennitala þess í kerfinu.


Að skoða ferli

Til þess að fá yfirsýn yfir þau ferli sem eru í gangi hverju sinni bjóða Linux-kerfi upp á skipunina ps (stytting á process status) og pgrep (stytting á process grep) á borð við

ps              # ferli tengd núverandi skel
ps aux          # öll ferli í kerfinu
ps -ef          # önnur algeng framsetning
pgrep bash      # finna PID eftir nafni
sem sýna okkur mismunandi upplýsingar eftir því hvaða fánar eru notaðir.

Þegar við keyrum ps aux fáum við ítarlegan lista þar sem við sjáum meðal annars:

  • USER: hver á ferlið.
  • PID: auðkennisnúmerið.
  • %CPU / %MEM: örgjörva- og minnisnotkun.
  • COMMAND: hvaða skipun ræsti ferlið.

Rauntímayfirlit: top og htop

Ef við viljum frekar fylgjast með ferlunum í rauntíma getum við opnað gagnvirk kerfisyfirlit með skipunum eins og top (vísun í top processes) og htop (stytting á Hisham's top):

top
htop
þar sem top er jafnan til staðar á öllum Linux-kerfum á meðan htop býður upp á þægilegra og litríkara viðmót ef það er uppsett. Í báðum tilfellum má loka yfirlitinu með því að ýta á q lykilinn.


Að stöðva ferli

Stundum þurfum við að grípa inn í og stöðva keyrslu ákveðinna ferla. Með því að nota skipunina kill (stytting á kill):

kill 1234
biðjum við viðkomandi ferli kurteislega um að hætta keyrslu. Þrátt fyrir nafnið kill er þetta ekki alltaf harkalegt, því skipunin sendir sjálfgefið svokallað TERM (terminate) merki sem gefur forritinu færi á að vista gögn og loka skrám á réttan hátt.

Ef ferlið svarar ekki eða virðist frosið getum við beitt harðari leið með því að keyra

kill -9 1234
sem sendir merkið KILL og stöðvar ferlið tafarlaust án þess að gefa því færi á að ganga frá neinum gögnum. Við notum þessa skipun því eingöngu sem síðasta úrræði.

Við getum kannað öll þau merki sem kerfið getur sent með því að keyra

kill -l       # sýna lista yfir merki
til að fá heildarlista á skjánum.

Ef við þekkjum ekki PID-númer ferilsins en vitum nafnið á því getum við stöðvað það með skipunum eins og pkill (stytting á process kill) eða killall (stytting á kill all):

pkill firefox        # stöðva ferli eftir nafni
killall firefox      # svipað, fer eftir kerfi
sem finna og loka forritinu út frá nafni þess.


Verkstýring í skelinni

Skelin býður upp á öfluga leið til að stýra þeim verkefnum sem við ræsum beint úr henni. Með skipunum eins og jobs (stytting á jobs), fg (stytting á foreground) og bg (stytting á background):

sleep 60 &       # keyra í bakgrunni
jobs             # sýna bakgrunnsverkefni
fg               # færa síðasta verkefni í forgrunn
bg               # halda stöðvuðu verkefni áfram í bakgrunni
getum við stjórnað því hvort forrit keyri á meðan við vinnum í öðrum verkefnum eða hvort þau keyri í bakgrunni.

Auk þess nýtast flýtilyklar mjög vel við verkstýringu:

  • Ctrl + C: stöðva forrit sem er í gangi.
  • Ctrl + Z: setja forrit tímabundið í bið og losa skelina.

Við getum prófað þetta vinnuflæði með því að opna textaritil á borð við

nano stórt-skjal.txt
# ýttu á Ctrl+Z
jobs
fg
þar sem við setjum ritilinn í bið, skoðum verkefnin og færðum hann svo aftur á skjáinn til að halda ritun áfram.

Ef unnið er mikið yfir SSH-tengingar geta sérhæfð tól eins og tmux eða screen reynst afar gagnleg þar sem þau búa til sjálfstæða setu sem lifir áfram þótt nettengingin slitni tímabundið.

Prófaðu: bakgrunnsverkefni

Undir scripts/ möppunni er lítil skrifta sem telur niður og markmiðið er að keyra hana í bakgrunni og stjórna henni þaðan.

Lausn

Við getum ræst hana í bakgrunni og fært hana svo á skjáinn með því að keyra

./scripts/countdown.sh &
jobs
fg
en ef við viljum fremur prófa að keyra hana venjulega og stöðva hana beint má nota
./scripts/countdown.sh
og ýta svo á Ctrl + C til að loka henni.

Prófaðu: finna ferli

Prófaðu að ræsa langt sleep ferli í bakgrunni, finna út hvert PID-númer þess er og loka því svo kerfisbundið.

Lausn

Til þess að ræsa ferlið og nota innbyggðar breytur skeljarinnar getum við keyrt

sleep 300 &
echo $!
ps -p $!
kill $!
jobs
þar sem breytan $! geymir sjálfkrafa PID-númer þess ferlis sem við ræstum síðast í bakgrunni.

Vissir þú?

Fyrsta ferlið sem verður til þegar mörg Linux-kerfi ræsa sig heitir systemd og fær PID 1. Það er forfaðir flestra annarra ferla. Ef PID 1 hættir er kerfið yfirleitt í verulegum vandræðum.


Umhverfisbreytur

Skelin geymir mikilvægar upplýsingar í svokölluðum umhverfisbreytum (e. environment variables) sem öll forrit í kerfinu geta lesið. Við getum skoðað helstu breyturnar með því að keyra skipunina env (stytting á environment) ásamt almennum innbyggðum breytum á borð við:

echo $USER       # notandanafnið þitt
echo $HOME       # heimamappan þín
echo $PWD        # nouverandi mappa
env              # sýna margar umhverfisbreytur
sem sýna okkur upplýsingar um núverandi notanda og staðsetningu.

Við getum auðveldlega búið til nýja breytu í okkar skel með því að slá inn

NAFN="Anna"
echo "Halló $NAFN"
en hún verður aðeins til í þessari tilteknu skel.

Ef við viljum að önnur forrit sem við ræsum erfi breytuna verðum við að gera hana aðgengilega með innbyggðu skipuninni export (stytting á export):

export EDITOR=nano
sem gerir hana virka í öllu umhverfinu.

Við getum séð þennan mun mjög greinilega með því að ræsa litla undirskel með skipunum á borð við

NAFN="Anna"
bash -c 'echo $NAFN'
export NAFN
bash -c 'echo $NAFN'
þar sem breytan skilar engu í fyrsta skiptið en birtist svo réttilega eftir að hún hefur verið flutt út með export.

Leyndardómurinn á bak við skipanir: $PATH

Þegar við ritum skipun á borð við ls þarf skelin að vita nákvæmlega hvar forritið er hýst í kerfinu. Til að kanna þessa leitargetu skeljarinnar getum við keyrt

echo $PATH
which ls
command -v grep
en þar sést hvernig breytan PATH geymir lista yfir allar þær möppur sem leitað er í, aðskildar með tvípunktum.

Skelin fer kerfisbundið í gegnum möppurnar og keyrir fyrsta forritið sem passar við heitið, þar sem slóðin fylgir jafnan á borð við

/usr/local/bin:/usr/bin:/bin
og ræður röðin miklu um hvaða útgáfa forritsins keyrir.

Af hverju þarf stundum ./?

Þegar við keyrum skriftu í núverandi möppu skrifum við oft:

./scripts/hello.sh
Punkturinn merkir „núverandi mappa“. Flestar Linux-skeljar leita ekki sjálfkrafa í núverandi möppu þegar þú skrifar bara hello.sh, heldur aðeins í möppunum sem eru taldar upp í PATH.

Prófaðu: umhverfisbreytur í skriftu

Keyrðu scripts/hello.sh og skoðaðu hvernig hún notar $USER og $PWD.

Lausn

Við getum skipt um vinnslumöppur og keyrt skriftuna

cd ~/examples
./scripts/hello.sh
cd notes
../scripts/hello.sh
cd ~/examples
þar sem við sjáum að $PWD breytist í samræmi við staðsetningu okkar hverju sinni.


Upplýsingar um kerfið

Til að fá skjótar upplýsingar um það vélbúnaðar- og kerfisumhverfi sem við erum að vinna í bjóða Linux-kerfi upp á skipanir eins og hostname (stytting á hostname), uname (stytting á unix name), uptime (stytting á uptime), who (stytting á who), og w (stytting á who en sýnir meiri upplýsingar):

hostname        # nafn tölvunnar
uname -a        # upplýsingar um kjarna og vélbúnað
uptime          # hversu lengi kerfið hefur verið í gangi
who             # hverjir eru skráðir inn
w               # hverjir eru inni og hvað þeir eru að gera
sem sýna okkur rekstrarstöðu kerfisins á fljótlegan hátt.

Minni og diskapláss

Ef við viljum skoða hve mikið vinnsluminni og geymslupláss er laust í tölvunni nýtast skipanir á borð við free (stytting á free), df (stytting á disk free), lsblk (stytting á list block devices), og mount (stytting á mount), auk du sem við höfum þegar séð:

free -h         # minni í læsilegu formi
df -h           # laus pláss á skráakerfum
du -sh *        # stærð hluta í núverandi möppu
lsblk           # diskar og disksneiðar
mount           # tengd skráakerfi
þar sem df greinir laust geymslupláss á diskunum á meðan du sýnir hve mikið pláss hver tiltekin mappa eða skrá tekur í raun.

Hver er munurinn á df og du?

Af hverju sýna þau ekki alltaf sömu tölu?

Stutt svar

df horfir á allt skráakerfið í heild sinni á meðan du leggur saman stærðir skráa sem það finnur með því að fletta í gegnum möpputréð. Mismunur getur auðveldlega stafað af falnum skrám, ólíkum skráaréttindum eða skrám sem hefur verið eytt en eru enn opnar í opnum ferlum.

Prófaðu: stærð æfingagagna

Kannaðu hvaða mappa eða skrá í núverandi umhverfi þínu tekur mest geymslupláss.

Lausn

Við getum keyrt talningu og raðað niðurstöðunum með skipuninni

du -sh * .hidden_note 2>/dev/null | sort -h
þar sem sort -h raðar stærðum á borð við 4K, 10M og 1G á mannlegan hátt svo auðvelt sé að bera þær saman.

Smá samantekt

Eftir þennan hluta ættirðu að geta:

  • skoðað ferli með ps, top, htop og pgrep,
  • stöðvað ferli með kill og skilið muninn á venjulegu kill og kill -9,
  • notað &, jobs, fg, bg, Ctrl + C og Ctrl + Z,
  • lesið og búið til einfaldar umhverfisbreytur,
  • útskýrt hlutverk PATH,
  • skoðað grunnupplýsingar um kerfið með uname, uptime, free, df og du.