Naš varuh je znova zagnal storitve, ki smo jih namenoma ustavili
Operacije
Ena od naših varuhov zažene katero koli od naših storitev, ki je omogočena, a ne teče. Dvakrat oktobra je zagnala storitve, ki smo jih namenoma ustavili. Drugič so obiskovalci ene od naših strani približno 45 minut dobivali napake.
Zakaj ta varuh obstaja
Storitev, ki se ob prejemu signala SIGTERM čisto zaključi, na primer ker jo je nekaj ubilo po imenu, za systemd ni »napačna« (failed). Restart=on-failure je ne vrne nazaj in systemctl --failed je ne našteje. Ostane ugasnjena, dokler je slučajno nekdo ne opazi. Zato varuh išče storitve, ki so omogočene, a ne tečejo, in jih zažene.
Težava je v tem, da je storitev, ki ste jo ustavili ročno, videti povsem enako.
Prvič
7. oktobra smo ob 12:47 z ukazom systemctl stop ustavili video delavca, da bi uredili njegovo čakalno vrsto opravil. Ob 12:55 je spet tekel: zagnal ga je varuh.
Drugič
21. oktobra smo potrebovali pomnilnik stroja, ki strežuje tudi dve od naših strani, za test modela. Skript je ustavil spletne aplikacije strani, sinhronizacijsko opravilo in kontejner baze podatkov, spet z ukazom systemctl stop. Približno pet minut pozneje ju je časovnik, ki spremlja strani, ob 19:14 pa varuh, vrnil tunel in spletne aplikacije.
Tunel je spet sprejemal promet, a spletne aplikacije niso mogle odgovarjati: testirani model je zasedel 114 GiB pomnilnika stroja. Od približno 19:14 do 20:00 so nekateri obiskovalci dobivali napake 502. Ob 20:00 smo onemogočili tunel, spletne aplikacije in sinhronizacijsko opravilo ter ustavili časovnik za spremljanje.
Pravilo, ki ga uporabljamo zdaj
- Storitev začasno ustavite tako, da jo onemogočite:
sudo systemctl disable --now <unit>. Vrnite jo zsudo systemctl enable --now <unit>. Naš varuh upošteva samo omogočene storitve, zato onemogočene ne moti. - Zaustavite vse, kar jo lahko znova zažene: tunel pred njo in morebitne časovnike, ki jo spremljajo.
- Kratek premor je tekma z uro. Če uporabite samo
stop, končajte pred naslednjo preverbo, ki na naših strojih nastopi v nekaj minutah.
Še dve pasti systemd iz istih mesecev
systemctl mask --runtimene naredi ničesar za enoto v /etc/systemd/system. Enote v /etc imajo prednost pred masko v /run, zato ukaz uspe, storitev pa se vseeno zažene. Za zadržanje storitve uporabimo drop-in zConditionPathExists=!/etc/<name>.hold: dokler ta datoteka obstaja, se storitev ne zažene, niti ob zagonu niti ročno.systemctl is-activeoznači tekočo storitev oneshot kot neaktivno. Medtem ko seType=oneshotstoritev izvaja, je njeno stanje "activating", zatois-activeto izpiše in vrne 3. Zanka, kot jewhile systemctl is-active --quiet job.service; do sleep 60; done, ki naj počaka na nočno opravilo, se takoj konča. Namesto tega preberite stanje: active, activating, reloading ali deactivating vsi pomenijo, da se še vedno izvaja.
Factory Floor spremlja omogočene storitve, ki ne tečejo. Privzeto jih samo prijavi, zažene pa jih šele, če to vklopite. Od različice 1.0.3 njegovo opozorilo tudi pove, kako namenoma zaustaviti storitev, njegova navodila za obratovanje pa prav tako.