====== 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