Watchdog kami telah memulakan semula perkhidmatan yang kami hentikan dengan sengaja
Operasi
Salah satu watchdog kami memulakan mana-mana perkhidmatan kami yang didayakan tetapi tidak berjalan. Dua kali pada bulan Oktober, ia memulakan perkhidmatan yang kami hentikan dengan sengaja. Kali kedua, pengunjung ke salah satu laman kami menerima ralat selama kira-kira 45 minit.
Sebab watchdog itu wujud
Perkhidmatan yang keluar dengan bersih apabila menerima SIGTERM, contohnya kerana sesuatu membunuhnya berdasarkan nama, tidak dianggap "gagal" oleh systemd. Restart=on-failure tidak mengembalikannya, dan systemctl --failed tidak menyenaraikannya. Ia kekal mati sehingga seseorang secara kebetulan menyedarinya. Jadi, watchdog mencari perkhidmatan yang didayakan tetapi tidak berjalan, dan memulakannya.
Masalahnya ialah perkhidmatan yang anda hentikan secara manual kelihatan sama persis.
Kali pertama
Pada 7 Oktober, kami menghentikan pekerja video dengan systemctl stop pada pukul 12:47 untuk menyunting baris gilir kerjanya. Pada pukul 12:55, ia sudah berjalan semula: watchdog telah memulakannya.
Kali kedua
Pada 21 Oktober, kami memerlukan memori mesin yang juga melayan dua laman kami untuk ujian model. Satu skrip menghentikan aplikasi web laman tersebut, satu kerja penyegerakan dan satu bekas pangkalan data, sekali lagi dengan systemctl stop. Kira-kira lima minit kemudian, satu pemasa yang memantau laman-laman tersebut, dan pada pukul 19:14 watchdog, telah menghidupkan semula terowong dan aplikasi web.
Terowong itu mula menerima trafik semula, tetapi aplikasi web tidak dapat menjawab: model yang diuji memegang 114 GiB daripada memori mesin. Dari kira-kira pukul 19:14 hingga 20:00, sesetengah pengunjung menerima ralat 502. Pada pukul 20:00, kami melumpuhkan terowong, aplikasi web dan kerja penyegerakan, serta menghentikan pemasa pemantauan.
Peraturan yang kami gunakan sekarang
- Jeda perkhidmatan dengan melumpuhkannya:
sudo systemctl disable --now <unit>. Kembalikan dengansudo systemctl enable --now <unit>. Watchdog kami hanya melihat perkhidmatan yang didayakan, jadi perkhidmatan yang dilumpuhkan dibiarkan begitu sahaja. - Jeda semua yang boleh mengembalikannya: terowong di hadapannya dan mana-mana pemasa yang memantaunya.
- Penghentian seketika ialah perlumbaan. Jika anda hanya menggunakan
stop, selesaikan sebelum pemeriksaan seterusnya, yang pada mesin kami berlaku dalam masa beberapa minit.
Dua lagi perangkap systemd daripada bulan yang sama
systemctl mask --runtimetidak berfungsi untuk fail unit dalam /etc/systemd/system. Unit dalam /etc mempunyai keutamaan lebih tinggi daripada penghalang masa jalan dalam /run, jadi arahan itu berjaya tetapi perkhidmatan masih bermula. Untuk menahan perkhidmatan, kita gunakan drop-in denganConditionPathExists=!/etc/<name>.hold: selagi fail itu wujud, perkhidmatan tidak akan bermula, sama ada semasa but atau secara manual.systemctl is-activememanggil perkhidmatan oneshot yang sedang berjalan sebagai tidak aktif. Semasa perkhidmatanType=oneshotberjalan, keadaannya ialah "activating", jadiis-activemencetak itu dan mengembalikan 3. Gelung sepertiwhile systemctl is-active --quiet job.service; do sleep 60; done, yang bertujuan untuk menunggu kerja malam, keluar serta-merta. Baca keadaan itu sebaliknya: active, activating, reloading atau deactivating semuanya bermakna ia masih berjalan.
Factory Floor memantau perkhidmatan yang didayakan tetapi tidak berjalan. Secara lalai, ia hanya melaporkannya, dan ia memulakannya hanya jika anda mengaktifkan pilihan itu. Sejak versi 1.0.3, amaran itu juga menyatakan cara menjeda perkhidmatan secara sengaja, dan runbooknya menyatakan perkara yang sama.