Beetaversioon: sisu on enamasti terviklik ja avalikuks katsetamiseks valmis, kuid vajab veel tehnilist, keelelist ja kasutatavuse kontrolli.

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

Protsess on töötav programmi eksemplar, millel on süsteemi protsessinumber ehk PID. Shelli töö võib koosneda ühest või mitmest protsessist, näiteks torust. Signaal on protsessile saadetav juhtsõnum.

Vaata, mis töötab

KäskTulemus
psselle terminaliga seotud protsesside hetkeseis
ps auxlaiem loend koos omaniku, PID-i, CPU ja mälu kasutusega
topuuenev protsessivaade; välju q-ga
jobs -lselle shelli töönumbrid, seisud ja PID-id

htop on eraldi paigaldatav mugavam jälgimisvaade. CPU ja mälu näitude tähendus ning arvutusvahemik sõltuvad tööriistast; üks hetkepilt ei tõesta pikaajalist koormust.

ps aux tavaväljundis on kolmas veerg CPU protsent ja neljas mälu protsent. sort -nrk sordib valitud veeru arvuliselt kahanevaks; head jätab kümme esimest rida:


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

Need annavad kiire ülevaate, kuid päiserida ei püsi eraldi päisena. Pikema jälgimise jaoks kasuta top-i.

Järjest või korraga

sleep N ootab N sekundit. Tavaliselt ootab shell käsu lõppu enne järgmise alustamist; ; eraldab järjestikuseid käske.


sleep 3; echo 'pikk töö valmis'
sleep 1; echo 'lühike töö valmis'

Esimene teade ilmub umbes kolme, teine nelja sekundi järel. Nüüd võrdle taustatöödega: & lubab shellil kohe edasi minna, sh -c käivitab jutumärkides oleva käsujada eraldi shellis ja wait ootab oma taustatööde lõppu.


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

Tavaliselt ilmub hiljem alustatud lühikese töö teade esimesena ning mõlemad lõpevad umbes kolme sekundiga. Käivitamisjärjekord ei määra lõpetamisjärjekorda. Kui sisestad ridu aeglaselt, võib töö enne jobs-i juba valmis olla.

Peata ja jätka sama tööd

Tee see katse interaktiivses shellis, mitte ühe kopeeritud skriptina.

  1. Käivita sleep 120, vajuta Ctrl-z. Programm peatub ja viip tuleb tagasi.
  2. Käivita veel kord sleep 120 ning vajuta jälle Ctrl-z.
  3. Vaata jobs -l. Otsi oma kahe sleep-töö numbrid.
  4. Kui need on 1 ja 2, jätka esimest käsuga bg %1 ja too teine ette käsuga fg %2.
  5. Katkesta esiplaani töö Ctrl-c-ga. Too esimene ette fg %1 ja katkesta ka see.

Kasuta tegelikke töönumbreid, mitte tingimata 1 ja 2. %1 on praeguse shelli töönumber; paljas number käsule kill tähendab PID-i. bg ja fg jätkavad sama programmi, mitte ei käivita seda algusest.

Lõpetamine ja signaalid

TegevusMõju
Ctrl-csaadab esiplaani protsessigrupile tavaliselt SIGINT katkestussoovi
Ctrl-zsaadab tavaliselt SIGTSTP ajutise peatamise signaali
kill PIDvaikimisi SIGTERM: programm saab viisakalt lõpetada
kill -KILL PIDsunnitud lõpetamine; programm ei saa enam koristada ega salvestada

Ära proovi suvalist PID-i. Harjutuseks käivita oma ootaja ja salvesta $! kaudu viimase taustaprotsessi PID muutujasse:


sleep 120 &
ootaja=$!
ps -p "$ootaja"
kill "$ootaja"

Võid näha shelli teadet Terminated. Sunnitud lõpetamine on viimane abinõu, mitte veaotsingu algus.

Väike kohalik server

Python peab olema paigaldatud. Loo eraldi kataloog, milles pole isiklikke faile. --bind 127.0.0.1 lubab ühendusi ainult sellest arvutist; muidu kuulab Pythoni server vaikimisi ka võrguliideseid.


mkdir -p ~/tmp/serveri-naide
cd ~/tmp/serveri-naide
printf '%s\n' 'Tere kohalikust serverist!' > index.html
python3 -m http.server 8000 --bind 127.0.0.1 &
serveri_pid=$!

Ava brauseris localhost:8000. Kui port on hõivatud, vali teine port nii käsus kui aadressis. Lõpetamiseks kasuta samas shellis kill "$serveri_pid". See lõpetab ainult sinu salvestatud PID-iga protsessi.

Kas töö jääb akna sulgemisel alles?

& üksi seda ei taga. Interaktiivse kaugtöö jaoks kasuta tmux-i või screeni.

nohup paneb käivitatava programmi eirama ühenduse katkemisega seotud SIGHUP-signaali. Suuna ka sisend ja väljund terminalist eemale:


nohup sh -c 'sleep 10; echo "valmis"' < /dev/null > nohup-naide.log 2>&1 &

Kümne sekundi pärast peaks logis olema valmis. nohup ei kaitse taaskäivituse, voolukatkestuse ega administraatori sessioonipuhastuse eest.

Bashi ja zsh disown eemaldab töö shelli tööde loendist; see ei vabasta programmi automaatselt terminalisisendist ega -väljundist. Kasuta seda vaid siis, kui tead programmi sõltuvusi.

Minitest

  1. Muuda paralleelkatse ooteajad viieks ja kaheks sekundiks. Ennusta järjestikuse ja samaaegse variandi kogukestus.
  2. Miks ei näe uus terminaliaken vana akna jobs-loendit?
  3. Mis vahe on peatatud ja lõpetatud programmil?
  4. Käivita kohalik server, vaata selle PID-i ning lõpeta ainult see protsess. Kontrolli brauseris, et teenus enam ei vasta.

Peatüki täisspikker

Praktiline kasutus

Eesmärk

erista protsessi, shelli tööd ja signaali: vaata, millised protsessid töötavad, peata vajadusel ning jätka pikka tööd taustal

Põhikujud

  • ps aux | grep pythonotsi protsess
  • ps aux | sort -nrk 3 | headsuur CPU kasutus selles hetkepildis
  • ps aux | sort -nrk 4 | headsuur mälukasutus
  • 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