Mustand: sisu ei ole veel tehniliselt ega keeleliselt täielikult kontrollitud ega toimetatud.

Peatüki vaade

Linux/Unix/macOS käsurea kiirõpik

Praegu loed peatükki Protsessid, tööd ja signaalid, mis kuulub osasse Osa III: Failid, võrk ja süsteemitöö.

Protsessid, tööd ja signaalid

Selles peatükis vaatame, kuidas jälgida töötavaid protsesse, saata neile signaale ning kasutada shelli tööde juhtimist.

Loogika

Siin on oluline eristada kolme asja:

  1. protsess
  2. shelli töö
  3. signaal

Need on seotud, aga mitte samad:

  • protsess on käivitatud programm
  • töö on shelli vaates hallatav käsk või käsujada
  • signaal on viis protsessile juhtsõnum saata

Kiirspikker

  • ps näitab protsesse
  • ps aux või ps -ef näitab rohkem infot
  • top või htop näitab protsesse reaalajas
  • kill PID saadab protsessile signaali
  • kill -9 PID lõpetab protsessi jõuga
  • käsk & käivitab töö taustal
  • jobs näitab shelli taustatöid
  • bg jätkab tööd taustal
  • fg toob töö esiplaanile
  • wait ootab taustatööd ära
  • Ctrl-c katkestab käsu
  • Ctrl-z peatab käsu ajutiselt

Kõige tavalisemad tegevused päriselus on:

  • vaata, mis jookseb
  • peata või lõpeta kinni jäänud käsk
  • saada pikk töö taustale

Protsesside vaatamine


ps
ps aux
ps -ef

top
htop

top ja htop näitavad:

  • protsessi ID-d
  • kasutatavat mälu
  • protsessori koormust
  • käimasolevaid käske

Kõige kasulikumad variandid alguses on tavaliselt:


ps aux | grep python
top
htop

ehk kas otsid konkreetset protsessi või vaatad tervikut reaalajas.

Kui tahad väga kiiresti näha suurimaid protsessiressursside kasutajaid, siis need on head 1-linerid:


ps aux | sort -nrk 3 | head
ps aux | sort -nrk 4 | head

Siin:

  • veerg 3 on tavaliselt CPU kasutus
  • veerg 4 on tavaliselt mälu kasutus

See on väga praktiline, kui küsid:

  • mis praegu protsessorit sööb
  • mis võtab kõige rohkem mälu

Protsessi lõpetamine

Igal protsessil on tavaliselt PID ehk protsessi number.


kill 12345
kill -15 12345
kill -9 12345

Tavapraktika:

  • proovi esmalt tavalist kill või kill -15
  • kasuta kill -9 ainult siis, kui protsess ei allu viisakamale lõpetamisele

See loogika on oluline, sest:

  • SIGTERM annab programmile võimaluse ise viisakalt lõpetada
  • SIGKILL katkestab ta jõuga

Seepärast ei tasu kill -9 teha automaatselt esimeseks valikuks.

Tööd shellis: jobs, fg, bg

Shell oskab hallata käske ka töödena.

Näide:


sleep 300

vajuta seejärel Ctrl-z, et töö peatada, ja siis:


jobs
bg
jobs
fg

Tähendus:

  • Ctrl-z peatab töö ajutiselt
  • jobs näitab shelli teadaolevaid töid
  • bg jätkab peatatud tööd taustal
  • fg toob töö tagasi esiplaanile

Taustal saab töö käivitada ka kohe:


sleep 300 &
jobs

Kõige tavalisem lühike töövoog on:

  1. käivita käsk
  2. saad aru, et see võtab kaua aega
  3. vajuta Ctrl-z
  4. tee bg
  5. vaata jobs

See on põhjus, miks jobs, bg ja fg on seotud terminali ja shelli peatükkidega.

Järjest või korraga

Protsesside ja tööde juures tekib väga sageli küsimus: kas käsud käivad üksteise järel või samal ajal?

Kõige lihtsam rusikareegel on:

  • käsk1 ; käsk2 tähendab: tee järjest
  • käsk & tähendab: saada käsk taustale ja jätka kohe järgmisega

Järjestikune näide:


date '+%H:%M:%S'
sleep 3
echo 'kolm sekundit hiljem'
sleep 1
echo 'veel üks sekund hiljem'

Siin teine sleep ei alga enne, kui esimene on lõpetanud.

Taustaga näide:


sh -c 'sleep 3; echo "pikk töö valmis"' &
sh -c 'sleep 1; echo "lühike töö valmis"' &
jobs
wait

Siin käivad kaks tööd korraga. Kuigi "pikk töö" käivitati enne, võib "lyhike töö" lõpetada varem.

See ongi üks tähtis erinevus:

  • järjestikuses jadas määrab järjekorra shell
  • taustatööde puhul võivad lõpetamisajad olla teistsugused kui käivitamisjärjekord

Signaalid lühidalt

Signaal on lühike juhtsõnum protsessile.

Levinud näited:

  • SIGTERM palub protsessil viisakalt lõpetada
  • SIGKILL lõpetab protsessi jõuga
  • SIGINT tekib sageli Ctrl-c vajutamisel
  • SIGTSTP tekib sageli Ctrl-z vajutamisel

Kõige tavalisemad näited

Leia mõni protsess:


ps aux | grep ssh

Katkesta esiplaanil töötav käsk:

  • vajuta Ctrl-c

Peata ja saada töö taustale:


sleep 300

siis Ctrl-z, edasi:


bg
jobs

Päris näide: taustale saadetud pikk töö

Kui tahad õppida jobs, bg ja fg loogikat, siis sleep on endiselt üks parimaid harjutusi.


sleep 300

Seejärel:

  • vajuta Ctrl-z
  • käivita jobs
  • käivita bg
  • käivita uuesti jobs

Siin näed väga selgelt:

  • kuidas esiplaanil olev käsk peatatakse
  • kuidas shell muudab selle tööks
  • kuidas sama töö jätkub taustal

Ja lõpetuseks:


fg

või teises variandis:


kill %1

See on hea "päris shelli" näide, sest siin ei pea PID-i kohe käsitsi teadma.

Päris näide: kaks peatatud tööd ja %1, %2

Kui tahad aru saada, mida tähendavad fg %1 ja bg %2, siis tee teadlikult kaks peatatud tööd.

Kõigepealt:


sleep 120

vajuta Ctrl-z.

Siis:


sleep 240

vajuta jälle Ctrl-z.

Nüüd:


jobs
bg %1
jobs
fg %2

Loogika on:

  • %1 tähendab töö number 1 shelli jobs nimekirjas
  • %2 tähendab töö number 2
  • bg %1 jätkab esimese töö taustal
  • fg %2 toob teise töö ette

Kui tood töö 2 ette ja peatad selle uuesti Ctrl-z abil, siis võid sama loogikat jätkata ka nii:


bg %2
jobs

See on hea viis harjutada, et töö numbrid tulevad jobs väljundist, mitte "kõhutunde järgi".

See ei ole sama asi mis PID:

  • %1 on shelli töö number
  • 12345 tüüpi number on protsessi PID

Kui tahad taustal jooksva töö lõpetada shelli töö numbri järgi, siis võid teha ka:


kill %1

See on tihti mugavam kui hakata PID-i käsitsi otsima.

Päris näide: hiljem käivitatud töö võib enne lõpetada

See on väga hea harjutus mõistmaks, mida tähendab "korraga":


sh -c 'sleep 5; echo "viie sekundi töö lõpetas"' &
sh -c 'sleep 2; echo "kahe sekundi töö lõpetas"' &
jobs
wait

Siin käivitati viie sekundi töö enne, aga kahe sekundi töö lõpetab varem.

See aitab hästi eristada:

  • käivitamisjärjekorda
  • tegelikku lõpetamisjärjekorda

Just taustatööde juures ei ole need alati samad.

Mis juhtub, kui terminali aken läheb kinni

Siin tuleb veel üks oluline vahe:

  • jobs, bg, fg töötavad sinu praeguse shelli sees
  • kui see shell lõpeb, võivad ka tema taustatööd lõppeda

See tähendab, et pelgalt & ei ole sama asi mis "töö jääb kindlasti elama".

Kui tead, et terminal võib sulguda, on tavaliselt kolm praktilist varianti:

  • kasuta tmux-i või screen-i
  • kasuta nohup
  • mõnes shellis kasuta disown

Kui töö on oluline ja pikk, siis tmux on enamasti kõige mõistlikum valik.

nohup ja disown

nohup tähendab umbes "ära katkesta seda tööd lihtsalt sellepärast, et sessioon lõpeb".

Näide:


nohup sh -c 'sleep 10; echo "valmis"' > nohup-naide.log 2>&1 &
jobs

Siin:

  • nohup aitab tööl jääda ellu ka siis, kui sessioon kaob
  • väljund suunatakse faili, sest terminali ei pruugi enam olemas olla

disown on teistsugune tööriist:

  • käivitad töö kõigepealt tavaliselt
  • siis eemaldad selle shelli tööde nimekirjast

Näiteks:


sleep 120 &
jobs
disown %1
jobs

Pärast disown-i ei halda shell seda tööd enam samamoodi töö numbriga %1.

Hea rusikareegel:

  • kui vajad püsivat sessiooni, eelista tmux-i
  • kui vajad lihtsalt "ära tapa seda tööd terminali sulgemisel", siis nohup võib aidata
  • disown on kasulik pigem teadlikule shellikasutajale, mitte esimese valikuna algajale

Päris näide: käivita väike server taustal

Veel praktilisem näide on käivitada väike kohalik teenus:


python3 -m http.server 8000 &
jobs
ps aux | grep '[h]ttp.server'

Selle töövoo loogika:

  • & saadab käsu kohe taustale
  • jobs näitab shelli teadaolevat tööd
  • ps aux | grep '[h]ttp.server' näitab päris protsessi süsteemi vaates

Nii saad väga hästi aru, et:

  • shelli töö
  • süsteemi protsess

on seotud, aga mitte täpselt sama asi.

Kui tahad selle töö lõpetada:


kill %1

või leia PID ja kasuta kill PID.

Päris näide: vaata, mis protsess kasutab protsessorit

Kui jooksutad mõnda aktiivset käsku, siis on hea vaadata seda ka top abil:


top

See ei ole "copy-paste tulemus", vaid jälgimise tööriist:

  • leia oma protsess
  • vaata PID-i
  • vaata CPU või mälu kasutust

Kui see saab selgeks, siis muutuvad ka kill, ps ja logid palju mõtestatumaks.

Minitest

  1. Käivita sleep 120.
  2. Peata see Ctrl-z abil.
  3. Vaata tööd käsuga jobs.
  4. Jätka tööd taustal käsuga bg.
  5. Too see tagasi esiplaanile käsuga fg.
  6. Käivita kaks taustatööd kujul sh -c 'sleep 5; echo ...' & ja sh -c 'sleep 2; echo ...' &.
  7. Kasuta wait, et oodata mõlemad ära.
  8. Käivita python3 -m http.server 8000 & ja leia see protsess käsuga ps aux | grep.