Náš watchdog reštartoval služby, ktoré sme zámerne zastavili
Prevádzka
Jeden z našich watchdogov spustí ktorúkoľvek z našich služieb, ktorá je povolená, ale nebeží. Dvakrát v októbri spustil služby, ktoré sme zámerne zastavili. Druhýkrát návštevníci jednej z našich stránok dostávali chyby približne 45 minút.
Prečo tento watchdog existuje
Služba, ktorá korektne skončí po prijatí signálu SIGTERM, napríklad preto, že ju niečo zabilo podľa názvu, nie je z pohľadu systemd „zlyhaná“. Restart=on-failure ju nespustí znova a systemctl --failed ju neuvádza. Zostáva vypnutá, kým si toho niekto náhodou nevšimne. Watchdog preto hľadá služby, ktoré sú povolené, ale nebežia, a spúšťa ich.
Problém je, že služba, ktorú ste zastavili ručne, vyzerá úplne rovnako.
Prvýkrát
7. októbra sme zastavili video worker príkazom systemctl stop o 12:47, aby sme upravili jeho frontu úloh. O 12:55 už znova bežal: watchdog ho spustil.
Druhýkrát
21. októbra sme potrebovali pamäť stroja, ktorý obsluhuje aj dve z našich stránok, na test modelu. Skript zastavil webové aplikácie stránok, synchronizačnú úlohu a kontajner databázy, opäť príkazom systemctl stop. Približne o päť minút neskôr časovač, ktorý sleduje stránky, a o 19:14 watchdog, znovu spustili tunel a webové aplikácie.
Tunel znova prijímal prevádzku, ale webové aplikácie nedokázali odpovedať: testovaný model zaberál 114 GiB pamäte stroja. Od približne 19:14 do 20:00 dostávali niektorí návštevníci chyby 502. O 20:00 sme zakázali tunel, webové aplikácie a synchronizačnú úlohu a zastavili časovač.
Pravidlo, ktoré teraz používame
- Pozastavte službu jej zakázaním:
sudo systemctl disable --now <unit>. Obnovte ju príkazomsudo systemctl enable --now <unit>. Náš watchdog sa pozerá iba na povolené služby, takže zakázanú nechá na pokoji. - Pozastavte všetko, čo ju môže znovu spustiť: tunel pred ňou a akýkoľvek časovač, ktorý ju sleduje.
- Krátkodobé zastavenie je súboj s časom. Ak použijete iba
stop, dokončite prácu pred ďalšou kontrolou, ktorá na našich strojoch prichádza do niekoľkých minút.
Ďalšie dve nástrahy systemd z rovnakých mesiacov
systemctl mask --runtimenič nespraví s unit súborom v/etc/systemd/system. Unit súbory v/etcmajú prioritu pred runtime maskou v/run, takže príkaz prebehne úspešne a služba sa stále spustí. Na pozastavenie služby používame drop-in sConditionPathExists=!/etc/<name>.hold: kým tento súbor existuje, služba sa nespustí ani pri štarte systému, ani ručne.systemctl is-activeoznačí bežiacu oneshot službu za neaktívnu. Kým beží služba sType=oneshot, jej stav je „activating“, takžeis-activevypíše túto hodnotu a vráti 3. Slučka akowhile systemctl is-active --quiet job.service; do sleep 60; done, určená na čakanie na nočnú úlohu, okamžite skončí. Namiesto toho čítajte stav: active, activating, reloading alebo deactivating všetky znamenajú, že služba stále beží.
Factory Floor sleduje povolené služby, ktoré nebežia. Predvolene ich iba hlási a spúšťa ich len vtedy, ak to zapnete. Od verzie 1.0.3 jeho upozornenie tiež uvádza, ako službu zámerne pozastaviť, a jeho runbook hovorí to isté.