RestartSec ดูเหมือนว่าจะถูกใช้เฉพาะเมื่อบริการเฉพาะนั้นเป็นบริการที่ถูกรีสตาร์ทผ่านคำสั่ง systemctl restart
ตัวอย่างเช่นฉันมีสองบริการ A และ B
[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always
และ
[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30
ถ้าคุณทำการ systemctl รีสตาร์ท B มันทำงานได้ตามที่คาดไว้ ... แต่ถ้าคุณทำการ systemctl รีสตาร์ท A ทั้งสองบริการจะหยุดและเริ่มต้นทันทีอีกครั้งโดยไม่ล่าช้า
เห็นได้ชัดว่า Systemd ใช้ค่าการกำหนดค่าสำหรับบริการเดียวที่คุณระบุและไม่สนใจการอ้างอิงใด ๆ
นี่ไม่ใช่เรื่องแปลกอย่างที่มันฟัง หาก B พูดคุยกับเซิร์ฟเวอร์ระยะไกลการเริ่มต้นและการหยุดอย่างรวดเร็วอาจล้มเหลวเนื่องจากปลายทางระยะไกลปฏิเสธลูกค้า แต่การรีสตาร์ท A โดยตรงจะเกิดขึ้นทุกครั้งที่มีการอัปเดตโดยไม่มีการเปลี่ยนแปลงเป็น B
คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยเพิ่มการหน่วงเวลาไปที่ A เช่นกัน แต่คุณไม่ควรทำเช่นนี้เพราะจะแยกการแยกวัตถุโดยทำให้ A รู้เกี่ยวกับ B เมื่อไม่ได้ขึ้นต่อกัน
systemctl stop myservice && sleep 3 && systemctl start myservice