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
ups
) - 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.