Naš nadzorni proces je ponovo pokrenuo servise koje smo namerno zaustavili
Operacije
Jedan od naših nadzornih procesa pokreće svaki naš servis koji je omogućen, ali ne radi. Dva puta u oktobru pokrenuo je servise koje smo namerno zaustavili. Drugi put, posetioci jednog od naših sajtova dobijali su greške oko 45 minuta.
Zašto taj nadzorni proces postoji
Servis koji se uredno završi kada primi SIGTERM, na primer zato što ga je nešto ubilo po imenu, za systemd nije „neuspeo“. Restart=on-failure ga ne vraća, a systemctl --failed ga ne navodi. Ostaje ugašen dok ga neko slučajno ne primeti. Zato nadzorni proces traži servise koji su omogućeni, ali ne rade, i pokreće ih.
Problem je u tome što servis koji ste ručno zaustavili izgleda potpuno isto.
Prvi put
7. oktobra zaustavili smo video radnika pomoću systemctl stop u 12:47 da bismo izmenili njegov red poslova. U 12:55 ponovo je radio: nadzorni proces ga je pokrenuo.
Drugi put
21. oktobra bila nam je potrebna memorija mašine koja takođe opslužuje dva naša sajta za testiranje modela. Skripta je zaustavila veb aplikacije sajtova, posao sinhronizacije i kontejner baze podataka, ponovo pomoću systemctl stop. Otprilike pet minuta kasnije tajmer koji prati sajtove, a u 19:14 i nadzorni proces, vratili su tunel i veb aplikacije.
Tunel je ponovo primao saobraćaj, ali veb aplikacije nisu mogle da odgovore: model pod testom zauzimao je 114 GiB memorije mašine. Od oko 19:14 do 20:00, neki posetioci su dobijali greške 502. U 20:00 onemogućili smo tunel, veb aplikacije i posao sinhronizacije, i zaustavili tajmer za praćenje.
Pravilo koje sada koristimo
- Pauzirajte servis tako što ćete ga onemogućiti:
sudo systemctl disable --now <unit>. Vratite ga pomoćusudo systemctl enable --now <unit>. Naš nadzorni proces gleda samo omogućene servise, pa onemogućenog ostavlja na miru. - Pauzirajte sve što ga može vratiti: tunel ispred njega i svaki tajmer koji ga prati.
- Kratko zaustavljanje je utrka. Ako koristite samo
stop, završite pre sledeće provere, koja na našim mašinama dolazi za nekoliko minuta.
Još dve systemd zamke iz istih meseci
systemctl mask --runtimene radi ništa za jediničnu datoteku u /etc/systemd/system. Jedinice u /etc imaju prioritet nad privremenom maskom u /run, pa komanda uspešno završi, a servis i dalje startuje. Da bismo zadržali servis, koristimo drop-in saConditionPathExists=!/etc/<name>.hold: dok ta datoteka postoji, servis se neće pokrenuti, ni pri podizanju sistema ni ručno.systemctl is-activeoznačava pokrenuti oneshot servis kao neaktivan. DokType=oneshotservis radi, njegovo stanje je "activating", pais-activeto ispisuje i vraća 3. Petlja poputwhile systemctl is-active --quiet job.service; do sleep 60; done, koja treba da čeka noćni posao, odmah izlazi. Umesto toga pročitajte stanje: active, activating, reloading ili deactivating znače da je i dalje u toku.
Factory Floor prati omogućene servise koji ne rade. Podrazumevano ih samo prijavljuje, a pokreće ih samo ako to omogućite. Od verzije 1.0.3 njegovo obaveštenje takođe navodi kako namerno pauzirati servis, a njegov runbook kaže isto.