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
Þ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
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
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
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
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
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
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
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
./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) ásamt almennum innbyggðum breytum á borð við:
echo $USER # notandanafnið þitt
echo $HOME # heimamappan þín
echo $PWD # nouverandi mappa
env # sýna margar umhverfisbreytur
Við getum auðveldlega búið til nýja breytu í okkar skel 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 (stytting á export):
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.
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
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
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á 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
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
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
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,htopogpgrep, - stöðvað ferli með
killog skilið muninn á venjulegukillogkill -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,dfogdu.