====== SystemD ======
* základem je jednotka.. je několik typů, například:
* service - spouštění procesu (obdoba init skriptu)
* target - seznam jednotek service vedoucích k požadovanému cíli (obdoba run level)
* mělo by jít použít i jako skupinu služeb pro hromadné zapínání/vypínání
* timer - časovač k jednotce service (obdoba cron)
* jednotka umí
* restartovat při pádu, sledovat stav
* omezovat zdroje jako cpu/paměť
* spouštění jednotek, až když jsou potřeba (on demantd loading)
* šablony - spouštění podobných služeb, např. getty@.service je šablona služby použivaná pro každé tty
* systemd umí vytvářet virtuální stroje
* tj. oddělení procesů, vlastní init
* výpis aktuálních strojů zobrazuje ''machinectl''
===== Příkaz systemctl =====
* příkaz pro řízení, výpis jednotek
* výpis všech typů:
systemctl --all --type help
Available unit types:
service
socket
busname
target
snapshot
device
mount
automount
swap
timer
path
slice
scope
* syntax: ''systemctl PŘÍKAZ PATTERN'', kde PATTERN je seznam jednotek ve tvaru JEDNOTKA[.TYP]
* příkazy
* ''is-active/is-enabled/is-failed'' - pro zjišťování stavu konkrétních jednotek můžeme použít příkaz
* Tyto příkazy navíc vrací jako návratový kód nulu, pokud je podmínka splněna pro alespoň jednu jednotku.
* pokud se služba terpve spouští, vrací is-active nenulovou hodnotu (tj. není aktivní) a vypisuje "activating"
* služba může zobrazit i nečekaně stav "unknown" [[https://bugzilla.redhat.com/show_bug.cgi?id=1073481|diskuze]]
* ''enable/disable'' - povolení či zakázání spouštění jednotky
* ''daemon-reload'' - aktualizace konfiguračních souborů jednotek
* aktualizují se všechny jednotky
* musí se volat po každé změně jakékoliv jednotky
* ''cat'' - zobrazí obsah souboru s jednotkou
* ''show'' - kompletní výpis parametrů jednotky (uživatelské + default)
* lze zjistit například čas startu procesu přes parametr ''ExecMainStartTimestamp''
* pro výpis konkrétního parametru lze použít argument ''-p ''
* umístění jednotek
* jednotky, které jsou instalovány z repozitářů, a tedy by je uživatel neměl měnit, sídlí v
* systémové ''/usr/lib/systemd/system''
* uživatelské ''/usr/lib/systemd/user''
* vlastní jednotky jsou standardně
* systémové ''/etc/systemd/system''.
* uživatelské ''/etc/systemd/user'' - jsou přístupné pro všechny uživatele
* osobní ''~/.systemd/user'' - pro každého uživatele zvlášť.
===== Jednotka service =====
* skládá se ze tří částí
* Unit
* Service
* Install
* service
* Type - typ služby
* Simple - spustí se proces, který je hlídán. Ukončení procesu způsobí ukončení služby
* Fork - předpokládá se, že spouštěný proces se ukončí a spustí jiný. Aby byla služba považována za aktivní, musí běžet aspoň jeden child
* Oneshot - proces se spustí pouze jednorázově a skončí. Je možné nastavit, aby se služba tvářila po ukončení jako stále aktivní
* ExecStartPre - co zavolat před spuštěním služby (může být použit opakovaně pro různé příkazy)
* ExecStart - co zavolat pro spuštění služby
* ExecStop - co zavolat pro ukončení služby. Volá se i v případě, že služba je zabita nebo sama ukončena.
* DefaultTimeoutStartSec a DefaultTimeoutStopSec přenastavit výchozí časy, nebo pro každou jednotku zvlášť pomocí TimeoutStartSec a TimeoutStopSec.
* EnvironmentFile
* lze využít k načtení parametrů z konfiguračního souboru
* který může být navíc modifikován příkazem v ExecStartPre (např. nastaví aktuální IP adresu)
* například
* vytvoří se ''/etc/sysconfig/myservice.cfg'' obsahující jen ''OPTIONS="--bind=192.168.1.10"''
* a pak použije jako:
[Service]
EnvironmentFile=/etc/sysconfig/myservice.cfg
ExecStart=/usr/bin/myservice ${OPTIONS}
* install
* WantedBy a RequiredBy, které říkají, kam se mají přidat závislosti při příkazu systemctl enable.
* Pokud chceme nějakou jednotku spouštět po startu, typicky nastavíme WantedBy=default.target, popř. WantedBy=multi-user.target.
* šablony - parametrické unity
* Pokud v systemd pracujeme s jednotkou obsahující zavináč (ve tvaru jmeno@parametr.typ), je hledán soubor jmeno@.typ a pro odlišení konkrétní instance se použije parametr.
===== Jednotka timer =====
* ukládá se do souboru ''nazev.timer'', musí k ní vždy existovat service jednotka
* dva typy
* Realtime timers
* spouštění na základě skutečného času jako událost kalendáře (obdoba cron)
* definuje se parametrem ''OnCalendar=''
* Monotonic timers
* spouští se relativně k nějakému startovacímu bodu
* Například OnBootSec, OnActiveSec
* při uspání počítače se zastaví
* definuje se parametrem ''OnTypeSec=''
* seznam aktivních časovačů lze vypsat příkazem
systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Sun 2017-12-03 11:00:59 CET 9min left Sun 2017-12-03 10:01:46 CET 49min ago anacron.timer anacron.service
Sun 2017-12-03 11:09:00 CET 17min left Sun 2017-12-03 10:39:04 CET 12min ago phpsessionclean.timer phpsessionclean.service
Sun 2017-12-03 22:00:00 CET 11h left Sun 2017-12-03 10:17:21 CET 34min ago fstrim.timer fstrim.service
Mon 2017-12-04 01:02:19 CET 14h left Sun 2017-12-03 10:17:17 CET 34min ago apt-daily.timer apt-daily.service
Mon 2017-12-04 06:04:13 CET 19h left Sun 2017-12-03 06:59:46 CET 3h 51min ago apt-daily-upgrade.timer apt-daily-upgrade.service
Mon 2017-12-04 06:47:32 CET 19h left Sun 2017-12-03 06:47:32 CET 4h 4min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
* Příklad s fstrim
* pravidelné spouštění příkazu každou neděli v deset hodin
systemctl cat fstrim.service
[Unit]
Description=Discard unused blocks
[Service]
Type=oneshot
ExecStart=/sbin/fstrim -a
systemctl cat fstrim.timer
[Unit]
Description=Discard unused blocks once a week
Documentation=man:fstrim
[Timer]
#OnCalendar=weekly
OnCalendar=Sun, 22:00
AccuracySec=1h
Persistent=true
[Install]
WantedBy=timers.target
===== Zdroje =====
* https://www.root.cz/clanky/nebojte-se-systemd-co-to-je-a-co-umi/
* návod pro začátečníky tak nějak
* https://www.freedesktop.org/software/systemd/man/index.html
* kompletní detailní dokumentace k systemd
* zajímavé podstránky
* https://www.freedesktop.org/software/systemd/man/systemd.exec.html
* volby pro spouštění příkazů přes ExecStop, ExecStart, Exec*...
* https://www.freedesktop.org/software/systemd/man/systemd.service.html
* volby pro jednotky typu service
* https://www.freedesktop.org/software/systemd/man/systemd.unit.html
* volby pro jednotku
* http://jlk.fjfi.cvut.cz/arch/manpages/man/systemd.time.7.en
* zadávání času, například do timer jhednotky