ตัวตรวจสอบระบบของเราเริ่มบริการที่เราตั้งใจหยุดไว้ใหม่
ปฏิบัติการ
ตัวตรวจสอบระบบตัวหนึ่งของเราจะเริ่มบริการใดก็ตามของเราที่เปิดใช้งานไว้แต่ไม่ได้ทำงาน สองครั้งในเดือนตุลาคม มันได้เริ่มบริการที่เราตั้งใจหยุดไว้ ครั้งที่สอง ผู้เข้าชมเว็บไซต์หนึ่งของเราพบข้อผิดพลาดนานประมาณ 45 นาที
เหตุผลที่ตัวตรวจสอบระบบตัวนี้มีอยู่
บริการที่จบการทำงานอย่างเรียบร้อยเมื่อได้รับ SIGTERM ตัวอย่างเช่นเพราะมีบางสิ่งฆ่ามันโดยระบุชื่อ จะไม่ถือว่า "failed" ในมุมมองของ systemd Restart=on-failure จะไม่เริ่มมันกลับมา และ systemctl --failed จะไม่แสดงรายการมัน มันจะหยุดนิ่งจนกว่าจะมีใครบังเอิญสังเกตเห็น ดังนั้นตัวตรวจสอบระบบจึงมองหาบริการที่เปิดใช้งานไว้แต่ไม่ได้ทำงาน แล้วเริ่มมัน
ปัญหาอยู่ที่ว่าบริการที่คุณหยุดด้วยมือจะดูเหมือนกันเป๊ะ
ครั้งแรก
เมื่อวันที่ 7 ตุลาคม เราหยุดตัวประมวลผลวิดีโอด้วย systemctl stop เวลา 12:47 เพื่อแก้ไขคิวงานของมัน เวลา 12:55 มันกลับมาทำงานอีกครั้ง: ตัวตรวจสอบระบบได้เริ่มมัน
ครั้งที่สอง
เมื่อวันที่ 21 ตุลาคม เราต้องการหน่วยความจำของเครื่องที่ให้บริการเว็บไซต์สองแห่งของเราสำหรับการทดสอบโมเดล สคริปต์หนึ่งได้หยุดเว็บแอปของเว็บไซต์ งานซิงก์ และคอนเทนเนอร์ฐานข้อมูล อีกครั้งด้วย systemctl stop ประมาณห้านาทีต่อมา ตัวจับเวลาที่คอยดูเว็บไซต์ และเวลา 19:14 ตัวตรวจสอบระบบ ได้เริ่มอุโมงค์และเว็บแอปกลับมา
อุโมงค์รับทราฟฟิกอีกครั้ง แต่เว็บแอปไม่สามารถตอบกลับได้: โมเดลที่อยู่ระหว่างการทดสอบครอบครองหน่วยความจำของเครื่องไว้ 114 GiB ตั้งแต่ประมาณ 19:14 ถึง 20:00 ผู้เข้าชมบางรายพบข้อผิดพลาด 502 เวลา 20:00 เราปิดใช้งานอุโมงค์ เว็บแอป และงานซิงก์ และหยุดตัวจับเวลา
กฎที่เราใช้ตอนนี้
- หยุดพักบริการโดยการปิดใช้งานมัน:
sudo systemctl disable --now <unit>นำมันกลับมาด้วยsudo systemctl enable --now <unit>ตัวตรวจสอบระบบของเราดูเฉพาะบริการที่เปิดใช้งานไว้ ดังนั้นบริการที่ปิดใช้งานจะถูกปล่อยไว้ - หยุดพักทุกสิ่งที่สามารถนำมันกลับมาได้: อุโมงค์ที่อยู่หน้ามันและตัวจับเวลาใดก็ตามที่คอยดูมัน
- การหยุดชั่วคราวคือการแข่งกับเวลา ถ้าคุณใช้เพียง
stopให้ทำให้เสร็จก่อนการตรวจสอบครั้งถัดไป ซึ่งบนเครื่องของเรามักจะเกิดขึ้นภายในไม่กี่นาที
กับดัก systemd อีกสองข้อจากเดือนเดียวกัน
systemctl mask --runtimeไม่มีผลกับไฟล์ unit ใน /etc/systemd/system หน่วยใน /etc จะมีความสำคัญสูงกว่าการ mask แบบ runtime ใน /run ดังนั้นคำสั่งจึงสำเร็จแต่บริการยังคงเริ่มทำงานอยู่ เพื่อระงับบริการ เราใช้ drop-in ที่มีConditionPathExists=!/etc/<name>.hold: ตราบใดที่ไฟล์นั้นยังอยู่ บริการจะไม่เริ่มทำงาน ทั้งตอนบูตและตอนเรียกใช้เองsystemctl is-activeเรียกบริการ oneshot ที่กำลังทำงานว่า inactive ขณะที่บริการType=oneshotกำลังทำงาน สถานะของมันคือ "activating" ดังนั้นis-activeจะพิมพ์ค่าดังกล่าวและคืนค่า 3 ลูปอย่างwhile systemctl is-active --quiet job.service; do sleep 60; doneซึ่งตั้งใจจะรอให้งานรายคืนเสร็จ จะจบลงทันที ให้ตรวจสอบสถานะแทน: active, activating, reloading หรือ deactivating ล้วนหมายความว่ายังทำงานอยู่
Factory Floor เฝ้าดูบริการที่เปิดใช้งานแต่ไม่ได้ทำงาน โดยค่าเริ่มต้นมันจะรายงานเท่านั้น และจะเริ่มบริการให้ก็ต่อเมื่อคุณเปิดใช้ตัวเลือกนั้น ตั้งแต่เวอร์ชัน 1.0.3 การแจ้งเตือนของมันยังบอกวิธีระงับบริการอย่างจงใจ และ runbook ของมันก็บอกแบบเดียวกัน