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

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

Kiirülevaade

Eesmärk on saada kontroll olukorra üle, kus midagi jookseb kaua, kasutab palju ressursse või peab liikuma taustale.

Käsk või mõisteMilleksMida tavaliselt näed
psvaata protsesside hetkeolukordaprotsesside tabel
top, htopjälgi reaalajaspidevalt uuenev vaade
kill PIDsaada protsessile signaaledukal juhul sageli vaikne
jobsnäita selle shelli taustatöidtöö numbrid nagu %1
bgjätka peatatud tööd taustaltöö jätkub taustal
fgtoo töö esiplaanilekäsk tuleb terminaliaknasse tagasi
waitoota taustatöö lõppulõpeb siis, kui töö lõpeb

PID on süsteemi protsessinumber; %1 ja %2 on ainult selle shelli töö numbrid.

Tüüpilised algaja vead

  • kasutatakse kohe kill -9, kuigi tavalisest kill-ist piisaks
  • aetakse segi PID ja jobs-i töö number
  • unustatakse, et taustatöö ei pruugi akna sulgemisel alles jääda
  • vaadatakse ainult protsesside nimekirja, ilma et küsitaks, kas töö kuulub üldse samale shellile

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 programmi töö
  • Ctrl-z peatab programmi 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

Need käsud vastavad kahele tavalisele küsimusele:

  • 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.

Peatüki täisspikker

Praktiline kasutus

Eesmärk

erista protsessi, shelli tööd ja signaali: vaata, mis jookseb, peata vajadusel ja too pikk töö taustale

Põhikujud

  • ps aux | grep pythonotsi protsess
  • ps aux | sort -nrk 3 | headCPU sööjad
  • ps aux | sort -nrk 4 | headmälusööjad
  • sleep 300 &käivita taustal
  • jobsvaata töid
  • fg %1too töö ette
  • topjälgi reaalajas
  • killsaada signaal
  • bgjätka taustal

Olulisemad lipud, märgid ja kiirnupud

  • Ctrl-ckatkesta programmi töö
  • Ctrl-zpeata ajutiselt; fg ette, bg taustale
  • &käivita taustal
  • %1töö number
  • kill -15viisakas lõpp
  • kill -9jõuga lõpp