Az őrszemünk újraindította azokat a szolgáltatásokat, amelyeket szándékosan leállítottunk
Üzemeltetés
Az egyik őrszemünk elindítja a bekapcsolt, de nem futó szolgáltatásainkat. Októberben kétszer is előfordult, hogy olyan szolgáltatásokat indított el, amelyeket szándékosan leállítottunk. A második alkalommal az egyik oldalunk látogatói körülbelül 45 percig hibákat kaptak.
Miért létezik ez az őrszem
Egy szolgáltatás, amely tiszta kilépéssel zárul a SIGTERM jelzésre, például mert valamelyik folyamat név szerint leállította, a systemd szemében nem „hibás”. A Restart=on-failure nem indítja újra, és a systemctl --failed sem listázza. Addig marad leállva, amíg valaki észre nem veszi. Az őrszem ezért keresi a bekapcsolt, de nem futó szolgáltatásokat, és elindítja őket.
A probléma az, hogy egy kézzel leállított szolgáltatás pontosan ugyanígy néz ki.
Az első alkalommal
Október 7-én 12:47-kor a systemctl stop paranccsal leállítottunk egy videó-feldolgozót, hogy szerkesszük a feladatsorát. 12:55-kor már újra futott: az őrszem elindította.
A második alkalommal
Október 21-én szükségünk volt arra a gépre, amely két oldalunkat is kiszolgálja, egy modellteszt miatt. Egy szkript leállította az oldalak webalkalmazásait, egy szinkronizálási feladatot és egy adatbázis-konténert, szintén a systemctl stop paranccsal. Körülbelül öt perccel később egy időzítő, amely az oldalakat figyeli, majd 19:14-kor az őrszem visszaállította az alagutat és a webalkalmazásokat.
Az alagut újra fogadta a forgalmat, de a webalkalmazások nem tudtak válaszolni: a tesztelt modell a gép memóriájának 114 GiB-ját foglalta le. Körülbelül 19:14-től 20:00-ig egyes látogatók 502-es hibákat kaptak. 20:00-kor letiltottuk az alagutat, a webalkalmazásokat és a szinkronizálási feladatot, valamint leállítottuk a figyelő időzítőt.
A szabály, amelyet most használunk
- Tiltsa le a szolgáltatást a szüneteltetéshez:
sudo systemctl disable --now <unit>. Indítsa újra asudo systemctl enable --now <unit>paranccsal. Az őrszemünk csak a bekapcsolt szolgáltatásokat nézi, így a letiltottakat békén hagyja. - Tiltsa le mindent, ami visszaállíthatja: az előtte lévő alagutat és minden figyelő időzítőt.
- A rövid leállítás versenyfutás. Ha csak a
stopparancsot használja, fejezze be a következő ellenőrzés előtt, amely a gépeinken percek belül bekövetkezik.
Még két systemd csapda ugyanabból az időszakból
- A
systemctl mask --runtimeparancs semmit nem csinál egy /etc/systemd/system könyvtárban lévő unit fájl esetén. Az /etc könyvtárban lévő unitok felülírják a /run könyvtárban lévő futásidejű maszkolást, így a parancs sikeresnek tűnik, de a szolgáltatás továbbra is elindul. Egy szolgáltatás felfüggesztéséhez egy drop-in fájlt használunk a következő beállítással:ConditionPathExists=!/etc/<name>.hold: amíg ez a fájl létezik, a szolgáltatás nem indul el, sem rendszerindításkor, sem kézzel. - A
systemctl is-activefutó oneshot szolgáltatást inaktívként jelöl. Amíg egyType=oneshotszolgáltatás fut, az állapota "activating", így azis-activeezt írja ki, és 3-as kimeneti kódot ad vissza. Egy olyan ciklus, mint awhile systemctl is-active --quiet job.service; do sleep 60; done, amely egy éjszakai feladat befejezésére vár, azonnal kilép. Ehelyett olvassa be az állapotot: az active, activating, reloading vagy deactivating mind azt jelenti, hogy még mindig fut.
A Factory Floor figyeli az engedélyezett, de nem futó szolgáltatásokat. Alapértelmezés szerint csak jelentést készít róluk, és csak akkor indítja el őket, ha Ön ezt bekapcsolja. Az 1.0.3 verzió óta a riasztás megadja, hogyan szüneteltesz egy szolgáltatást szándékosan, és a futtatási útmutató is ugyanezt tartalmazza.