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:
- protsess
- shelli töö
- 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
psnäitab protsesseps auxvõips -efnäitab rohkem infottopvõihtopnäitab protsesse reaalajaskill PIDsaadab protsessile signaalikill -9 PIDlõpetab protsessi jõugakäsk &käivitab töö taustaljobsnäitab shelli taustatöidbgjätkab tööd taustalfgtoob töö esiplaanilewaitootab taustatööd äraCtrl-ckatkestab käsuCtrl-zpeatab 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
3on tavaliselt CPU kasutus - veerg
4on 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
killvõikill -15 - kasuta
kill -9ainult siis, kui protsess ei allu viisakamale lõpetamisele
See loogika on oluline, sest:
SIGTERMannab programmile võimaluse ise viisakalt lõpetadaSIGKILLkatkestab 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-zpeatab töö ajutiseltjobsnäitab shelli teadaolevaid töidbgjätkab peatatud tööd taustalfgtoob töö tagasi esiplaanile
Taustal saab töö käivitada ka kohe:
sleep 300 &
jobs
Kõige tavalisem lühike töövoog on:
- käivita käsk
- saad aru, et see võtab kaua aega
- vajuta
Ctrl-z - tee
bg - 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äsk2tähendab: tee järjestkä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:
SIGTERMpalub protsessil viisakalt lõpetadaSIGKILLlõpetab protsessi jõugaSIGINTtekib sageliCtrl-cvajutamiselSIGTSTPtekib sageliCtrl-zvajutamisel
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:
%1tähendab töö number 1 shellijobsnimekirjas%2tähendab töö number 2bg %1jätkab esimese töö taustalfg %2toob 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:
%1on shelli töö number12345tüü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,fgtöö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õiscreen-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:
nohupaitab 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
nohupvõib aidata disownon 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 taustalejobsnäitab shelli teadaolevat töödps 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
- Käivita
sleep 120. - Peata see
Ctrl-zabil. - Vaata tööd käsuga
jobs. - Jätka tööd taustal käsuga
bg. - Too see tagasi esiplaanile käsuga
fg. - Käivita kaks taustatööd kujul
sh -c 'sleep 5; echo ...' &jash -c 'sleep 2; echo ...' &. - Kasuta
wait, et oodata mõlemad ära. - Käivita
python3 -m http.server 8000 &ja leia see protsess käsugaps aux | grep.