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
Þ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
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
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
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
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
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 &
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
[1] + running sleep 30
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
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
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
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
./scripts/countdown.sh
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
$! 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
Við getum búið til nýja breytu í skelinni með því að slá inn
NAFN="Anna"
echo "Halló $NAFN"
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
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'
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
/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
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
$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