Procesy a služby

Práce s procesy

V minulých kapitolách jsme se zaměřovali na základy práce se soubory, vytváření uživatelů, jejich přidávání do skupin a nastavovali jsme mnohá oprávnění souborů a složek jak pro uživatele, tak primárně skupiny.

Tím jsme získali základní znalosti toho, jak začít mít systém Linux (a jeho mnoho nesčetných distribucí) pod kontrolou. Nyní umíme zakázat uživatelům přistupovat k souborům, číst je, spouštět či do nich zasahovat.

Pojďme nyní navázat a říci si něco o procesech v operačním systému Linux. Co to jsou procesy, jaké mají vlastnosti, kdo je spouští, kde běží, jak fungují a především – jak je spravovat?

ps

Začneme u toho nejprimitivnějšího příkazu, kterým můžeme práci s procesy započít. Je jím command ps, který vypíše na konzoli aktuálně běžící procesy. Ale pozor, přehled se vypíše staticky, to znamená, že zde uvidíme informaci o aktuálně běžících procesech v době potvrzení příkazu. Dále se tato „tabulka“ již neaktualizuje.

Instalace ps

Ve výchozím nastavení je proces ps standardně v rámci Linuxových distribucí nainstalovaný. Pokud není, lze jej snadno nainstalovat pomocí příkazu:

apt-get install procps

Pokud je potřeba a nejsi přihlášen pod root uživatelem, přidej na začátek před příkaz ještě slovíčko sudo (superuser do – superuživateli, udělej…).

sudo apt-get install procps

Spuštění a základní práce s ps

Nyní již můžeme spustit příkaz ps jednoduchým zadáním a potvrzením:

ps

Pravděpodobně se Ti vypsalo něco takového:

PID   TTY      TIME     CMD
59678 ttys000  0:00.06 -bash
69505 ttys000  0:00.00 -bash
69506 ttys000  0:00.00 -bash
25070 ttys001  0:00.01 -bash

Nic zajímavého, že? Příkaz ps při spuštění bez jakýchkoliv parametrů totiž vypisuje pouze procesy, které běží pod uživatelem, který příkaz spustil a zároveň běží v tomtéž terminálu (konzoli).

Jaké parametry zde najdeme?

Můžeme si zde všimnou hned několika parametrů u procesů, a to

  • PID
  • TTY
  • TIME
  • CMD

PID je velmi podstatným číslem. Udává, v jakém pořadí byl proces spuštěn a jeho maximální hodnotou je číslo 65 536, což je ekvivalentem 2^16. Když se proces ukončí, číslo procesu PID se sice uvolní, ale v rostoucí řadě se pokračuje dále. Ve chvíli, kdy systém dojde s číslováním nakonec, začne opět od začátku a procesům přiřazuje takové PID, které již bylo uvolněno některým ukončeným procesem a nevyužívá se.

PID s hodnotou 1 zpravidla využívá init proces, který spouští všechny další, ale o něm se dozvíš až v příští kapitole „Služby“.

TTY jednoduše udává, v jakém terminálu proces běží. TIME značí délku běhu procesu a pod CMD se skrývá označení, jak se proces jmenuje, respektive jak jej lze spustit.

Další varianty spuštění příkazu ps s přepínači

Pro výpis všech běžících procesů na stroji, k němuž jsme přihlášení, lze využít

ps -ef

Chceme-li filtrovat procesy podle jména uživatele (či damona), pod nímž daný proces běží, využijme

ps -e -u uzivatel

Potřebujeme-li zobrazit všechny instance procesu, jehož jméno známe, použijeme

ps -C jmeno

FIltrovat lze však také podle PID procesu, můžeme jej klidně zkombinovat s předchozími znalostmi a vyhledat proces s PID 23 mezi všemi procesy. Spojíme tak přepínače -ef (zobrazí všechny procesy) a nový přepínač -p pro definici ID

ps -ef -p 23

Můžeme ale vyhledávat libovolné množství procesů podle PID, stačí je oddělit čárkami

ps -ef -p 23,86,1500,8034,41675

Neznáme-li přesné znění procesu, který může být spouštěn s různými přepínači a jejich hodnotami, můžeme využít nám již dobře známého příkazu grep. Oba příkazy poté spojíme do jednoho pomocí tzv. pipeningu (vertikální čáry). Jmenují-li se proces například apache, apache2, apache23 a my je chceme vypsat všechny, použijeme

ps -ef | grep apache

top

Jestli má příkaz ps nějaké nedostatky, jednoznačně to je neaktualizace procesů v reálném čase. Podobné chování můžeš znát ze systému Windows a jeho aplikace „Správce úloh“. K zobrazení živých dat o aktuálně běžících procesech, které se budou pravidelně aktualizovat, využij příkazu:

top

Přes celý terminál se vypíše měnící se přehled všech procesů běžících v systému. V rámci možností i přehledně. Vidíme zde mnoho sloupců, proto nepřidáváme screenshot, neboť by byl nečitelný. Ale věříme, že se s tím popereš skvěle!

top nabízí pokročilejší možnosti „konfigurace“, mezi které lze zařadit například omezení intervalu obnovování výpisu aktuálně běžících procesů. Pro aktualizace každé 3 vteřiny použij:

top -d 3

Výpis ukončíš a k promptu se navrátíš pomocí Control + C.

Filtrování procesů v rámci top

I u top příkazu lze filtrovat, například dle uživatele

top -u uzivatel

Protože je zde příkazů opravdu přehršel, rychle se mění a administrátora většinou v základním zobrazení zajímají hlavně procesy, které vyžadují velké množství systémových prostředků, lze jejich výpis omezit například na 10 pomocí přepínače -n a odpovídající hodnoty:

top -n 10

htop

Dalším správcem procesů do rodiny je příkaz htop. Instalace je opět jednoduchá:

apt-get install htop

A spuštění jakbysmet:

htop

htop má povedenější design a i jeho používání je intuitivnější

Zdroj: https://haydenjames.io/htop-quick-guide-customization/

Ovládání htop

V dolní části běžící konzolové „GUI“ aplikace jsou k dispozici další možnosti ovládání pomocí šipek, písmen a především funkčních kláves. K dispozici je

  • šipky – pohyb mezi procesy
  • mezerník – označení procesu tagem (pro zvýraznění)
  • U – odstraní všechny tagy
  • F1 – nápověda, lze využít také manuál man htop
  • F2 – základní nastavení
  • F3 – vyhledávání mezi procesy
  • F4 – filtrování i podle částečného názvu (alternativa ke grep u ps)
  • F5 – rodokmenové zobrazení (přehledný výpis závislých procesů)
  • F6 – řazení podle hodnoty ve sloupcích
  • F7 – zvýšení priority proces na úkor ostatních (pouze pomocí spuštění htop pomocí sudo)
  • F8 – snížení priority procesu
  • F9 – ukončení procesu (tzv. kill, viz. další kapitoly)
  • F10 – ukončení „aplikace“ htop

kill

Kromě přívětivých možností v podobě nástrojů zmíněných výše lze procesy ukončovat také ručně v příkazové řádce. Slouží nám k tomu příkaz kill.

Přehled signálů

Nejdříve si musíme ujasnit, jaké veškeré schopnosti tento příkaz má. Veškeré instrukce pro procesy zasílá pomocí tzv. signálů, které si vysvětlíme v tabulce níže:

název signálu hodnota důsledek
SIGHUP 1 nechá proces „čekat”
SIGINT 2 přeruší aktuální signál procesu a ukončí
SIGKILL 9 okamžitě ukončí proces
SIGTERM 15 ukončí aktuální signál procesu
SIGSTOP 17, 19, 23 zastaví proces

V tabulce se zmiňujeme o signálech a právě s těmi každý proces běžně pracuje – posílají se mu instrukce ve formě signálu, který následně dále zpracuje procesor. My můžeme díky příkazu kill také takový signál procesu zaslat. Tím nejoblíbenějším a v drtivé většině zcela nejpoužívanějším je signál SIGKILL (ostatní zpravidla nevyužiješ). Ten totiž proces nemilosrdně ukončí.

Lze tak učinit, pokud známe například PID procesu (třeba díky htop). Číselnou hodnotu signálu sdělíme příkazu pomocí prvního přepínače:

kill -9 3749

Čímž „zabijeme“ proces s PID 3749.

killall

V návaznosti na příkaz kill můžeme zabíjet také několik procesů najednou, a to pomocí jména. Máme-li otevřen webový prohlížeč Chrome a chceme ukončit veškeré jeho instance, použijeme

killall -9 chrome

Za trochu drastické lze považovat ukončení naprosto všech procesů běžících v systému, lze tak učinit pouhým zadáním

```

Nemáme-li dostatečná oprávnění, použijeme jednoduše

```sudo killall

Nechceme-li zjišťovat názvy procesů či jejich PID a chceme zkrátka ukončit všechny procesy, které neodpovídají, zadáme

killall -9 dd

Služby

SysV (a init obecně)

V roce 1983 poprvé spatřil světlo světa operační systém UNIX System V, který vznika několik dlouhých let za zdmi Bellových laboratoří. Zde v současné době dochází k nejrůznějším výzkumům a vývoji telekomunikačních zařízení.

Šlo o pátou a také nejúspěšnější generaci tohoto systému. Svým způsobem jde o přímého konkurenta odkloněného vývoje UNIXU, a to BSD. Proč je ale vlastně SysV, jak je System V zkracován, tak populární?

Přišel se zcela unikátními inicializačními skripty, které „rozpohybují“ střeva systému. Proto se mu (a jemu podobným) přezdívá tzv. init. V jednoduchosti si jej představme jako proces v operačním systému UNIX (respektive v našem kontextu jakožto Linux), který má na starosti spuštění všech dalších procesů nutných v operačním systému.

Díky tomu, že jde o zcela první spuštěný proces (ne tak docela, avšak vysvětlení by bylo komplikované a nad rámec těchto skript), jeho PID je rovno 1. Pod ním pak následně zřetězeně a rozvětveně běží další spuštěné procesy. Procesy, které se mají spustit při nastartování systému zcela „navrchu“, lze pak definovat v rámci /etc/init.d.

Pokud jsi někdy spouštěl/a operační systém, který nutně nemusí mít plně grafické prostředí, ale třeba jen příkazovou řádku (Debian, Fedora), mohl/a jsi vidět při nastartování výpis mnoha hlášek informující o úspěšném [OK] či neúspěšném [ERROR] spuštění některých dalších procesů (DNS, Apache, přihlášení uživatelů...). Právě toto spuštění a výpis na konzoli má v gesci první init proces.

Zdroj: https://commons.wikimedia.org/wiki/File:Systemd-on-fedora.png

Run-levely SysV

Samotný sysV pak sestává z několika run-levelů, v nichž může být spuštěn. Pro velmi zjednodušenou analogii se systémem Windows si lze představit „Nouzový režim“, kdy jsou k dispozici pouze omezené možnosti.

Přehled run-levelů SysV
  • 0 – Halt – vypnutí systému
  • 1 – Single-user text mode – pouze jeden uživatel, ideální pro opravy
  • 2 – Not used – podporuje více uživatelů (daemonů), ale neumožňuje síťová spojení
  • 3 – Full multi-user text mode – rozšiřuje 2. run-level o zpřístupnění sítě, jde o běžný start systému
  • 4 – Not used – neexistuje žádná definice, uživatel si může sám nadefinovat, jak bude daný run-level fungovat
  • 5 – Full multi-user graphical mode –rozširuje 3. run-level o grafické rozhraní a není omezen na příkazovou řádku
  • 6 – Reboot – restartování systému

Dlužno dodat, že každá linuxová distribuce může mít run-levely různě definované, ale v základu je obvyklé to zmíněné výše.

systemd

Vzhledem ke „zkostnatělosti“ SysV byla v roce 2010 zaměstnancem společnosti Red Hat, která se mimo jiné v současné době na vývoji Linuxu také podílí, vytvořena nová služba s pojmenováním systemd.

Služba systemd je nyní implementována v drtivé většině všech aktuálních Linuxových distribucí a jejím cílem je značné zjednodušení spouštění dalších procesů v rámci systému. Jak už jsme si řekli u SysV, i systemd je službou spouštějící první systémový proces init, který se postará o nastartování všech dalších.

Co má systemd na starosti?

init s PID 1 jako takový spouští další skripty, které zajišťují podstatný chod systému. Zprovozňuje například síťová rozhraní, správné ovladače k různým interním i externím kartám (pokud je obsahuje), připojuje disky a externí média do systémového souborového systému a nad vším dohlíží.

Mimoto služba systemd dohlíží nad správností běhu jednotlivých procesů, jakožto i aplikací, a v případě jejich pádu (jsou-li součástí init procesu) je opakované spouští, čeká a vypisuje chybové hlášky či informace o jejich úspěšném nastartování.

Pokud systemd zjistí. že některý proces využívá příliš mnoho procesorového výkonu, paměti, vytěžuje příliš síť či disk, je schopen takový proces „umírnit“ a odebrat mu určitou část systémových prostředků. To je velice užitečné, neboť se pak dostane i na zpracování dalších úloh jinými procesy.

systemd také ponechává informaci o tzv. zřetězení, tedy tvoří rodokmen procesů. Zjednodušeně řečeno – první proces init spustí nějaké další a ty zase své podprocesy. Díky tomu můžeme jako uživatelé, respektive spíše administrátoři či správci systému, snadno detekovat, odkud se bere některý z procesů, který například využívá mnoho systémových prostředků.

systemd vyniká ve správě závislostí

S pojmem závislosti jste se již určitě v prostředí Linuxu v minulosti setkali. Nejpravděpodobněji v kontextu nějakého balíčkovacího systému, například apt-get. Co jsou to přesně závislosti? Představme si, že chceme nainstalovat například webový server podporující některý z backendových jazyků, třeba PHP. Budeme potřebovat balíček apache2 (ideálně) a php, vedle toho však potřebujete tyto dva odlišné světy „propojit“, čehož docílíme balíčkem libapache2-mod-php – toto je ona závislost. Bez ní by oba balíčky nespolupracovaly – velmi jednoduše řečeno.

Jak bylo zmíněno o dva odstavce výše, systemd tvoří rodokmen voláním jednotlivých procesů jinými procesy. Avšak co když vznikne tzv. cyklus? Tedy, že proces1 zavolá proces2 a jakmile tento proces2 skončí, opět zavolá proces1. Zní to jednoduše, ale představme si, že bychom poté měli desítky spuštěných totožných procesů – akorát by byly pod sebou zřetězené. Jednak to standardně nedává příliš smysl, jednak bychom tím snadno za určitou dobu brzy využili veškerých systémových prostředků (CPU, RAM, síť, disk…).

Jak je v nadpisu uvedeno, systemd zvládá toto řešit bravurně. Dynamicky „přehazuje“ závislosti procesů tak, aby dávaly smysl a ukončuje ty, které již nejsou potřeba a v závislosti na cyklech spouští další..

Vedle toho může jeden proces vyžadovat ke svému chodu již spuštěný jiný proces. Ale neví o tom. Avšak systemd to ví a zajistí, aby byl tento proces delegován na takové místo v řetězci, aby vše fungovalo správně. Pokud proces využívá jiná aplikace, jednoduše se zařadí do fronty a počká si.

Jednoduché a přehledné. A efektivní k tomu všemu!

Jak systemd spouští jednotlivé procesy?

Veškeré dění okolo systemd, respektive jeho init procesu je umístěno v adresáři /etc/init.d. Jedná se o jeden z prakticky nejdůležitějších adresářů v operačním systému Linux. Představme si, že jsou zde umístěny různé skripty, které spouštějí různé procesy (aplikace).

Právě první proces init všechny tyto skripty z adresáře postupně při startu operačního systému spustí a zajistí nad nimi dohled (viz. výše). Tyto skripty se nazývají konfiguračními soubory, prakticky v nich můžeme nadefinovat, jakým způsobem se má aplikace spustit a co má dělat.

Rozdíly mezi systemd a SysV

Velmi ulehčující funkcionalitou systemd je možnost psaní konfiguračních souborů, které definují přímo běh procesu a jeho závislosti. Můžeme tak napsat konfigurační soubor pro proces, který vyžaduje další závislosti a systemd se efektivně a samostatně postará o rozdělení a změnu stromové struktury, pokud je to potřeba, a řízení přístupu procesů k jednotlivým závislostem.

Nespornou výhodou je také přítomnost na většině moderních distribucí, což významně usnadňuje orientaci systémovým administrátorům a bohatou možnost konfigurace služeb.

systemd je zkrátka univerzální inicializační systém, který pokrývá mnohé oblasti sysV a v mnohém jde ještě dále.

results matching ""

    No results matching ""