Hlídač nočních úloh mi hned našel tři mrtvé
Doma se mi každou noc spouští 63 úloh. Postavil jsem si obrazovku, která ukáže všechny naráz. Tři z nich byly týden po smrti.

Ve čtvrtek 18. 9. večer, když už děti spaly, jsem si sedl a poprvé sepsal všechno, co se u nás doma spouští samo. Čekal jsem nudný seznam. U tří řádků mi ale vyšlo, že poslední povedený běh je starý týden. Jedna z nich se za ten týden pokusila naběhnout sedmkrát a sedmkrát umřela, aniž by si toho kdokoli všiml. Hlídání, které jsem kolem toho postavil, mě pak stálo 0 Kč, protože běží na serveru, který doma bzučí tak jako tak.
Doma se toho v noci děje víc, než jsem čekal
Chytrá domácnost není jen to, co vidíš na zdi. Pod tím vším běží obyčejné naplánované úlohy. Ve 3:30 se zálohuje databáze. Ve 4:00 si trezor s poznámkami odtáhne kopii jinam. Ráno se do nákupního seznamu propíše, co došlo, a rozvrh ze školy se stahuje třikrát denně. Nic z toho nesvítí a nic z toho necinká.
Když jsem si to poprvé spočítal, vyšlo mi 63 úloh na osmi strojích. Do té doby jsem každou z nich kontroloval tak, že jsem si na ni vzpomněl. To není systém, to je štěstí.
| Co běží | Kolik toho je |
|---|---|
| Naplánované úlohy systemd | 47 |
| Úlohy agenta, který mi třídí poštu | 8 |
| Externí kontroly, které samy křičí | 8 |
| Z toho zapnutých | 60 |
| Vypnutých schválně | 3 |
Co ta obrazovka umí
Jeden seznam, jeden řádek na úlohu. U každé je vidět, kdy běžela naposledy, jak dopadla, kdy poběží příště a jestli je vůbec zapnutá. Nic víc. Žádné grafy, žádná historie, protože to už si umí každý stroj sám.
Důležitá je jedna věc: stav se nikam neukládá. Dopočítá se až ve chvíli, kdy se na obrazovku podívám. Když se sběr na hodinu rozbije, uvidím, že data jsou stará, a ne uklidňující zelenou z minulého týdne.
Co na to potřebuješ
- Server, který ti doma stejně běží. U mě Proxmox, ale je to jedno. 0 Kč navíc.
- systemd. Máš ho v každém Linuxu, umí plánovat i hlásit. 0 Kč.
- Healthchecks. Hlídací služba, která čeká na zavolání a když nepřijde, ozve se sama. Dá se provozovat doma zdarma a do 26. 9. jsem ji tak měl i já. Placená varianta v cloudu začíná kolem 5 USD měsíčně, tu nepotřebuješ.
- Půl večera. U mě to byly tři hodiny včetně chyb popsaných níž.
Celé to tedy stálo nula korun a jeden večer. Jediná investice byla, že jsem si konečně sedl a sepsal, co u nás doma vlastně běží.
Jak jsem to postavil
Nejdřív inventura. Projel jsem všechny stroje a vypsal, co má naplánovaný běh. Právě tahle nudná část odhalila ty tři mrtvé úlohy, ještě než vznikl řádek kódu. Kdybych skončil tady, vyplatilo by se to.
Pak sběrač. Malý skript na hostiteli, každých 15 minut se zeptá každého kontejneru na stav jeho úloh a pošle to do jedné tabulky.
Nakonec hlídání zvenčí. Úloha po sobě zavolá na adresu hlídací služby. Když zavolání nepřijde do dohodnutého času, služba mi napíše. Tohle je ta část, kterou doporučuju udělat první, i kdyby ses na obrazovku vykašlal:
# /etc/systemd/system/zaloha.service
[Unit]
Description=Nocni zaloha
OnFailure=hlaska-o-selhani@%n.service
[Service]
Type=oneshot
ExecStart=/opt/skripty/zaloha.sh
ExecStartPost=/usr/bin/curl -fsS -m 10 --retry 3 https://hlidac.doma/ping/ID-KONTROLY
Dva řádky, dva různé druhy ochrany. ExecStartPost řekne hlídači, že se to
povedlo. OnFailure zavolá vlastní službu ve chvíli, kdy to spadne. Bez toho
druhého řádku systemd selhání jen zapíše do logu a mlčí dál.
Tohle mám od 19. 9. u všech 47 úloh. Zprávu neposílá stroj, na kterém to spadlo, ale hlídací služba, takže klíč k Telegramu leží na jednom místě a ne v osmi kontejnerech. Každá úloha zná jen adresu své vlastní kontroly.
Jedna věc mě přitom málem doběhla. Každá úloha potřebuje vlastní kontrolu, ne jednu společnou. Hlídací služba totiž píše jen při změně stavu, takže kdyby všechny úlohy sdílely jednu, druhý pád by byl zase tichý. A přesně o to tady celou dobu jde.
Kde jsem se sekl: monitor mi začal hlídat uvítací nápis
Do seznamu úloh se mi na jednom kontejneru nastěhovalo pět řádků, které vypadaly takhle: "Spoolman LXC Container", "OS: Debian GNU/Linux" a tak dál. Můj hlídač začal hlídat uvítací obrázek, který se vypíše po přihlášení.
Našel jsem to až o den později, když jsem si pro tenhle zápisek ověřoval čísla
proti databázi. Příčina je hloupá a stojí za zapamatování. Spouštěl jsem příkazy
jako přihlašovací shell, takže se nejdřív vypsal uvítací nápis a teprve pak
výsledek. Můj kód bral za úlohu každý řádek, který nepoznal, místo aby bral jen
ty, co končí na .timer. Filtr, který vyhazuje známé smetí, je vždycky slabší
než filtr, který pouští jen známý tvar. Opravené to bylo za deset minut, ale
hledal jsem to půl hodiny.
Tři menší pasti z toho prvního večera, ať je nemusíš potkat taky:
systemctl show --valuevrací hodnoty v pořadí, které si zvolí systemd, ne v tom, v jakém se ptáš. A prázdná hodnota nezabere řádek, takže se ti všechno posune. Kvůli tomu mi 43 zapnutých úloh chvíli svítilo jako vypnuté. Řešení je ptát se na dvojiceKLIC=hodnota.systemctl list-timersmá v posledním sloupci název služby, ne časovače. Když bereš poslední sloupec, dostaneš.servicea divíš se, proč nic nesedí.- Dva moje kontejnery běží v UTC, zbytek v našem čase. Čtyři úlohy proto vypadaly dvě hodiny opožděně, i když běžely přesně.
Jak to vypadá po prvním dni
Poctivě: běží to od 18. 9., takže tvrdit cokoli o dlouhodobé spolehlivosti by bylo vymýšlení. Čísla za měsíc sem doplním 18. 10.
Co vím teď: 63 úloh, 60 zapnutých, za posledních sedm dní nula selhání. Jedna kontrola je ale právě teď červená, a je to poučné. Vypnul jsem úlohu, kterou už nepotřebuju, ale hlídač na ni pořád čeká a hlásí, že se neozvala. Vypnutí úlohy je tedy dvoukrokové. Když na druhý krok zapomeneš, vychováš si hlídače, kterého začneš ignorovat, a to je nejhorší možný stav.
Zvládne to zbytek rodiny?
Tohle je jediná obrazovka v domě, kterou manželka nikdy neotevře, a je to tak správně. Nikdo doma nechce vědět, že se ve 4:00 kopírovala databáze.
Rodina to pozná jinak. Když padne úloha od nákupního seznamu, v sobotu chybí věci. Když se rozbije stahování rozvrhu, starší jde do školy podle včerejška. Ty tři mrtvé úlohy naštěstí nebyly z týhle kategorie, protože mi shodou okolností umřely věci kolem tohohle blogu. Kdyby to byl kalendář ze školy, přišel bych na to stejně, jen nepříjemněji.
Co bych udělal jinak
- Začal bych hlídáním zvenčí, ne obrazovkou. Obrazovka ukáže problém, až se na ni podívám. Hlídač zavolá sám.
- Napsal bych si
OnFailure=do každé úlohy hned na začátku. Doplnil jsem ho až druhý den, do všech 47 úloh naráz, a je to přesně ta věc, kvůli které ty tři umíraly potichu. - Nepsal bych filtr na smetí. Vždycky bych psal filtr na známý tvar.
- Udělal bych inventuru dřív. Samotné sepsání, co u nás běží, mělo větší hodnotu než celý zbytek večera.
- Nespoléhal bych na to, že si vzpomenu. Půl roku jsem věřil, že o svém domě vím všechno. Kolik úloh mi v něm běží, jsem zjistil až ten čtvrtek večer.
Kolik naplánovaných úloh ti běží doma a kdy ses na ně naposledy koukal?
Sousední díl: Dům, který sám zavolá dřív, než teče, o vrstvě hlídačů na vodu, vzduch a baterie.
Taťka
Píšu o domě, ve kterém bydlíme. Home Assistant na Proxmoxu, 2 900+ entit, fotovoltaika s baterií, tepelné čerpadlo, rekuperace přes Modbus, závlaha po zónách a dvě děti, které to všechno testují líp než já.
Občanské jméno tady nenajdeš, ale všechno ostatní je skutečné.


