บริการ systemd เริ่มต้นใหม่โดยอัตโนมัติหลังจาก StartLimitInterval


33

ฉันต้องการให้บริการ systemd ของฉันเริ่มต้นใหม่โดยอัตโนมัติเมื่อเกิดข้อผิดพลาด นอกจากนี้ฉันต้องการให้คะแนน จำกัด การรีสตาร์ท ฉันต้องการอนุญาตให้รีสตาร์ทได้สูงสุด 3 ครั้งภายในระยะเวลา 90 วินาที ดังนั้นฉันได้ทำการกำหนดค่าต่อไปนี้

[บริการ]
รีสตาร์ท = เสมอ
StartLimitInterval = 90
StartLimitBurst = 3

ตอนนี้บริการจะเริ่มต้นใหม่เมื่อล้มเหลว หลังจาก 3 ความล้มเหลวอย่างรวดเร็ว / รีสตาร์ทจะไม่เริ่มอีกต่อไปตามที่คาดไว้ ตอนนี้ฉันคาดว่า systemd จะเริ่มบริการหลังจากหมดเวลา (StartLimitInterval) แต่ systemd จะไม่เริ่มบริการโดยอัตโนมัติหลังจากหมดเวลา (90sec) ถ้าฉันเริ่มบริการด้วยตนเองหลังจากหมดเวลามันทำงาน แต่ฉันต้องการให้ systemd เริ่มบริการโดยอัตโนมัติหลังจาก StartLimitInterval โปรดแจ้งให้เราทราบเกี่ยวกับวิธีการใช้คุณสมบัตินี้


3
ผมเขียนบทความที่อธิบายถึงวิธีการสร้างบริการและวิธีการหลีกเลี่ยงปัญหานี้โดยเฉพาะอย่างยิ่ง: การสร้างบริการ Linux กับ systemd
เบนจามิน

2
ผมคิดว่าคุณกำลังมองหาไม่StartLimitIntervalSec StartLimitInterval
Marc Tamsky

คำตอบ:


29

หากต้องการให้เซอร์วิสรีสตาร์ท 3 ครั้งในช่วงเวลา 90 วินาทีให้รวมบรรทัดต่อไปนี้ในไฟล์ serviced systemd ของคุณ:

Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3

สิ่งนี้ใช้ได้กับฉันสำหรับบริการที่ใช้งานสคริปต์โดยใช้ 'Type = idle' โปรดทราบว่า 'StartLimitInterval' จะต้องมากกว่า 'RestartSec * StartLimitBurst' มิฉะนั้นบริการจะเริ่มต้นใหม่โดยไม่มีกำหนด

ฉันใช้เวลาสักครู่ในการทดลองและข้อผิดพลาดจำนวนมากเพื่อหาวิธีที่ systemd ใช้ตัวเลือกเหล่านี้ซึ่งแนะนำว่า systemd ไม่ได้รับการบันทึกไว้เช่นเดียวกับที่หวังไว้ ตัวเลือกเหล่านี้ให้เวลารอบการลองใหม่และการลองซ้ำสูงสุดที่ฉันกำลังค้นหาอย่างมีประสิทธิภาพ


ควรทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับได้ ...
Jeff

ไม่สามารถหาStartLimitInterval=คำสั่งใน Ubuntu ล่าสุดของฉันได้ ...
ไส้ตะเกียง

10

พฤติกรรมที่คุณอธิบายนั้นสอดคล้องกับเอกสารประกอบ:

StartLimitInterval =, StartLimitBurst = กำหนดค่าการ จำกัด อัตราการเริ่มบริการ ตามค่าเริ่มต้นบริการที่เริ่มต้นมากกว่า 5 ครั้งภายใน 10 วินาทีจะไม่ได้รับอนุญาตให้เริ่มต้นอีกครั้งจนกว่าช่วงเวลา 10 วินาทีจะสิ้นสุดลง ด้วยสองตัวเลือกเหล่านี้การ จำกัด อัตรานี้อาจมีการแก้ไข ใช้ StartLimitInterval = เพื่อกำหนดช่วงเวลาการตรวจสอบ (ค่าเริ่มต้นคือ DefaultStartLimitInterval = ในไฟล์กำหนดค่าผู้จัดการตั้งค่าเป็น 0 เพื่อปิดการ จำกัด อัตราการใช้ชนิดใด ๆ ) ใช้ StartLimitBurst = เพื่อกำหนดว่าจะอนุญาตให้เริ่มกี่ครั้งต่อหนึ่งช่วงเวลา (ค่าเริ่มต้นคือ DefaultStartLimitBurst = ในไฟล์กำหนดค่าตัวจัดการ) ตัวเลือกการกำหนดค่าเหล่านี้มีประโยชน์อย่างยิ่งเมื่อใช้ร่วมกับ Restart =; อย่างไรก็ตามจะใช้กับการเริ่มต้นทุกประเภท (รวมถึงการใช้งานด้วยตนเอง) ไม่ใช่เฉพาะกับการเริ่มต้นใหม่โดยตรรกะรีสตาร์ท =โปรดทราบว่าหน่วยที่ได้รับการกำหนดค่าสำหรับเริ่มต้นใหม่ = และถึงขีด จำกัด การเริ่มต้นจะไม่พยายามที่จะเริ่มต้นใหม่อีกต่อไป อย่างไรก็ตามพวกเขายังคงสามารถเริ่มต้นใหม่ด้วยตนเองในภายหลังจากจุดที่ตรรกะการเริ่มต้นใหม่จะเปิดใช้งานอีกครั้ง โปรดทราบว่า systemctl รีเซ็ตล้มเหลวจะทำให้ตัวนับอัตราการเริ่มต้นใหม่สำหรับบริการที่จะล้างข้อมูลซึ่งมีประโยชน์หากผู้ดูแลระบบต้องการเริ่มบริการด้วยตนเองและขีด จำกัด การเริ่มต้นรบกวนสิ่งนั้น

ฉันยังคงพยายามคิดหาวิธีที่จะบรรลุพฤติกรรมที่คุณต้องการ


นี่เป็นความคิดเห็นมากกว่าคำตอบในขณะที่คุณชี้ให้เห็น
Dave M

สิ่งที่ฉันต้องการแน่นอน,
ลินุกซ์ Nerd บางคน

ตามเอกสารที่คุณเชื่อมโยงมันควรจะเป็นStartLimitIntervalSec=(และDefaultStartLimitIntervalSec=) ไหม? หมายเหตุการเพิ่มSecไปยังชื่อพารามิเตอร์ทั้งสอง
Doktor J

6

หลายปีต่อมาและด้วยsystemd 232มันไม่ทำงานอีกต่อไปตามที่อธิบายไว้ในคำถามและคำตอบจากปี 2559 ชื่อตัวเลือกStartLimitIntervalSecและส่วนต่าง ๆ ได้เปลี่ยนไป ตอนนี้มันต้องดูเหมือนตัวอย่างนี้:

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

สิ่งนี้จะทำการรีสตาร์ท 5 ครั้งใน 30 วินาที (5 * 6) และอีกหนึ่งรีสตาร์ทใน 33 วินาที ดังนั้นเราจึงมี 6 รีสตาร์ทใน 33 วินาที เกินขีด จำกัด รีสตาร์ท 5 ครั้งใน 33 วินาที ดังนั้นการรีสตาร์ทจะหยุดที่ 5 นับหลังจากนั้นประมาณ 31 วินาที


1
ดูเหมือนว่าStartLimitIntervalจะยังคงได้รับการสนับสนุนหากไม่มีเอกสารในServiceส่วน แต่ใหม่ที่ต้องการจะทำงานเฉพาะในStartLimitIntervalSec Unit
Danek Duvall

1

คุณสามารถตั้งค่าOnFailureให้เริ่มบริการอื่นเมื่อล้มเหลว ในบริการล้มเหลวคุณสามารถเรียกใช้สคริปต์ที่รอแล้วเริ่มบริการของคุณใหม่

สำหรับตัวอย่างเกี่ยวกับวิธีตั้งค่านี้ให้ดูที่เมลสถานะ Systemd เกี่ยวกับความล้มเหลวของหน่วยและแก้ไขเพื่อรีสตาร์ทเซอร์วิสแทน


1

StartLimitAction=rebootคุณสามารถใช้ นี่จะรีบูตระบบหลังจาก StartLimitInterval

StartLimitAction = กำหนดค่าการกระทำที่จะดำเนินการหากขีด จำกัด อัตราที่กำหนดด้วย StartLimitInterval = และ StartLimitBurst = ได้รับผลกระทบ รับหนึ่งในไม่รีบูตแรงรีบูตหรือรีบูตทันที หากไม่มีการตั้งค่าการกดปุ่มขีด จำกัด อัตราจะทำให้ไม่มีการดำเนินการใดนอกจากการเริ่มต้นจะไม่ได้รับอนุญาต การรีบูตทำให้การรีบูตเป็นไปตามโพรซีเดอร์การปิดระบบปกติ (เช่นเทียบเท่ากับ systemctl reboot) reboot-force เป็นสาเหตุให้มีการรีบูตแบบบังคับซึ่งจะยุติกระบวนการทั้งหมดที่บังคับใช้ แต่ไม่ควรทำให้ระบบไฟล์สกปรกในการรีบูต (เช่นเทียบเท่ากับ systemctl reboot -f) และรีบูตทันทีทำให้การเรียกใช้รีบูตทันที (2) ซึ่งอาจส่งผลให้ ในการสูญเสียข้อมูล เริ่มต้นที่ไม่มี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.