Hoppa yfir í efnið

Kerfið og ferli

Verkefnasafn

Þessi kafli hefur tilheyrandi verkefnasafn á fylgiþjóninum. Til að sækja það og byrja að leysa verkefnin geturðu keyrt skipunina:

fetch system-and-processes

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, baksviðsverk og margt fleira. Í þessum hluta ætlum við að læra hvernig við fylgjumst með því sem gerist á bak við tjöldin.

Hvað er ferli?

Þegar þú biður skelina um að keyra forrit á borð við ls býr stýrikerfið til ferli (e. process). Forritið sjálft er samansafn skipana en ferlið er keyrslan á þeim skipunum. Við getum hugsað um forritið sjálft eins og uppskrift, en ferlið er sú framkvæmd að fylgja uppskriftinni.

Sérhvert ferli fær sitt eigið PID (e. Process ID) sem virkar sem einkvæmt (e. unique) auðkenni þ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 zsh       # 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

Ef við viljum 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.

Ferli á fylgiþjóninum

Á fylgiþjóninum er búið að kveikja á ýmsum öryggisstillingum til að vernda alla notendur hans og friðhelgi þeirra. Ein af þessum stillingum er að notendur sjá aðeins þau ferli sem þeir eiga. Þannig kunna úttökin úr þessum skipunum að vera heldur tómleg á fylgiþjóninum.


Að stöðva ferli

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

kill 1234
biðjum við viðkomandi ferli kurteislega um að hætta keyrslu. Þrátt fyrir ofbeldsfullt nafn er sú ekki alltaf raunin, því sjálfgefin stilling kill sendir svokallað TERM (terminate) merki (e. signal) sem gefur forritinu færi á að vista gögn og loka skrám á réttan hátt, áður en það hættir keyrslu.

Ef ferlið svarar ekki því merki, eða virðist frosið, getum við beitt harkalegri 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. Best er að nota þ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,

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


Verkstýring í skelinni

Skelin býður upp á ýmsar leiðir til að stýra þeim ferlum sem við ræsum í henni. Til að keyra skipun í bakgrunni getum við sett og-merki & fyrir aftan skipunina. Prófum t.d. að sjá muninn á skipununum

sleep 5
sleep 5 &
Sú fyrri keyrir í 5 sekúndur og í kjölfarið verður skipanalína skeljarinnar aftur aðgengileg, en þegar sú seinni er keyrð verður skipanalínan strax aðgengileg aftur og skipunin er keyrð í bakgrunninum.

Svefn

Skipunin sleep gerir ekkert annað en að taka pásu, þ.e. gerir nákvæmlega ekki annað en að bíða í þann fjölda sekúnda sem gefin er sem viðfang. Það kann að hljóma einkennilega að slík skipun sé til, en hún getur reynst mjög gagnleg þegar margar skipanir eru keyrar í röð eða í lykkju, og einnig þegar kemur að því að skrifa skriftur.

Til að fá yfirsýn yfir alla þá ferla sem eru keyrandi í skelinni getum við notað skipunina ĵobs. Ef við prófum aftur að keyra

sleep 30 &
jobs
fáum við eitthvað í líkingu við
[1]  + running    sleep 30
út úr því (ef jobs var keyrt innan við 30 sekúndum frá sleep 30 &). Þetta segir okkur að eitt ferli, sleep 30, sé keyrandi í bakgrunninum í þessari skel og hægt sé að vísa í það með tölunni 1. Athugum að þessi tala er ekki það sama og PID, heldur er þetta auðkenni þessarar skeljarlotu á þessu tiltekna ferli.

Hægt er að vísa í þetta auðkenni með skipunum eins og kill. Þannig getum við keyrt

sleep 30 &
kill %1
til að stöðva bakgrunnsferlið með auðkenni 1.

Ef við viljum færa ferli úr bakgrunni í forgrunn getum við notað skipunina fg (sytting á foreground). Ef hún er keyrð án viðfangs, setur hún síðusta ferli (með hæsta auðkennið) í forgrunn, en einnig er hægt að velja hvaða ferli er sett í forgrunn með því að gefa auðkennið sem viðfang, þ.e. fg %1. Þannig getum við gert

sleep 10 &
fg
til að fá sleep 10 aftur í forgrunn.

Hægt er að setja ferli í bið með Ctrl+Z. Athugið að þetta er ekki það jafngilt því að nota Ctrl+C sem reynir að stöðva keyrslu forrits með því að senda því svokallað INT (interrupt) merki. Með því að setja ferli í bið, hættir keyrsla þess tímabundið, og við fáum aftur aðgang að skelinni. Hægt er að segja skelinni að halda áfram keryslu ferla sem hafa verið sett í bið með skipuninni bg (stytting á background). Að nota Ctrl+Z og bg er því ekki ósvipað því að keyra skipun upp með &. Skipunin virkar á svipaðan hátt og fg, þannig hægt er að gefa viðfang sem segir til um hvaða ferli við viljum að haldi áfram keyrslu, og sé ekkert viðfang gefið heldur síðasta færsla í bið áfram (með hæsta auðkennið).

Prófum

cd ~/examples/data
less paragraph.txt
# ýttu á Ctrl+Z
jobs
bg
jobs
fg
Hér opnum við less, sendum það í bið, skoðum svo þau ferli sem eru í gangi í bakgrunninum. Eftir það látum við ferlið halda áfram í bakgrunninum. Þar sem less gerir ekkert nema að bíða eftir skipunum frá okkur, þá hefur það lítil áhrif. Loks sendum við ferlið aftur inn í forgrunn og þá getum við aftur farið að nota forritið.

Tökum saman allar þessar leiðir sem ferli getur ferðast á milli forgrunns, bakgrunns og biðstöðu í eftirfarandi stöðuriti.

stateDiagram-v2
    state "Í forgrunni" as FG
    state "Í bakgrunni" as BG
    state "Í bið" as ST

    [*] --> FG: skipun keyrð
    FG --> BG: <code>&</code>
    BG --> FG: <code>fg</code>
    FG --> ST: Ctrl+Z
    ST --> BG: <code>bg</code>
    ST --> FG: <code>fg</code>
    FG --> [*]: Keyrslu lokið eða <code>kill</code>
    BG --> [*]: Keyrslu lokið eða <code>kill</code>
    ST --> [*]: <code>kill</code>

Langtíma verkstýring

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 lotu (e. session) sem lifir áfram þótt nettengingin rofni eða SSH-lotunni ljúki.

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), en hún gefur okkur lista yfir allar setter umhverfisbreytur.

Hefð er fyrir því að nöfn umhverfisbreyta innihaldi bara hástafi, eins og t.d. USER sem inniheldur notandanafn núverandi notanda og HOME sem inniheldur heimamöppu hans. Til að vísa í umhverfisbreytur í skelinni notum við dollaramerkið $, þannig getum við séð gildi einstaka breyta með

echo $USER
echo $HOME
echo $PWD
sem sýna okkur upplýsingar um núverandi notanda og staðsetningu.

Við getum búið til nýja breytu í skelinni með því að slá inn

NAFN="Anna"
echo "Halló $NAFN"
en hún verður aðeins til í þessari tilteknu skel. Ef við skráum okkur út og inn eða ræsum nýja skel, þá verður breytan ekki lengur til staðar.

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, þ.e.

export EDITOR=nano
sem gerir hana aðgengilega undirferlum sem ræst eru úr núverandi skel.

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 eftir að hún hefur verið flutt út með export.

Varanlegar umhverfisbreytur

Athugum að umhverfisbreytur lifa aldrei lengur en skelin sem skilgreindi þær. Ef við viljum setja varanlega umhverfisbreytu, þannig að hún sé alltaf til staðar, verðum við að bæta við export skipun í sérstakar stillingaskrár, svosem .bashrc eða .zshrc (sem notuð er á fylgiþjóninum), sem eiga heima í heimamöppu hvers notanda.

Að finna skipanir

Þegar við sláum inn skipun á borð við ls þarf skelin að vita nákvæmlega við hvaða forrit er átt og hvar það á heima í kerfinu. Umhverfisbreytan PATH, sem við getum séð með

echo $PATH
geymir lista yfir allar þær möppur sem leitað er í, aðskildar með tvípunktum, eins og t.d.
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Skelin fer í gegnum möppurnar, frá vinstri til hægri, og keyrir fyrsta forritið sem finnst í þessum möppum sem ber sama nafn og skipunin sem slegin var inn. Við sjáum því að röðin miklu um hvaða útgáfa forritsins keyrir, þar sem forrit í möppum sem eru aftar í listanum hafa lægri forgang en þau sem eru framar.

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á upplýsingar um vélbúnað og kerfið sem við erum að vinna í bjóða Linux-kerfi upp á skipanir eins og hostname, uname (stytting á unix name), uptime, who, og w (stytting á who).

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 skráðir inn og hvað þeir eru að gera

ATH

Vegna öryggis- og friðhelgisstillinga sýnir w engar upplýsingar um aðra á fylgiþjóninum.


Verkefni

Hér má finna öll verkefnin úr efni þessa kafla.

Opna verkefni