Systemd: จะมั่นใจได้อย่างไรว่าบริการ“ oneshot” ถูกลองใหม่หากล้มเหลวในครั้งแรก


18

ฉันได้อ่าน manpage บริการ systemd สองสามครั้ง แต่ฉันยังไม่สามารถหารูปแบบ systemd พื้นฐานได้:

ฉันต้องการเรียกใช้กระบวนการเริ่มต้นหนึ่งครั้ง (เช่นตัวเทียบท่าคอนเทนเนอร์หรือฟอร์แมตไดรฟ์) เมื่อเริ่มต้นระบบจนเสร็จสมบูรณ์ แต่ถ้าฉันใช้ Type = oneshot สำหรับสิ่งนั้นฉันไม่สามารถใช้ Restart = on-failure และถ้ามันล้มเหลวมันจะไม่ลองอีกครั้ง ฉันขาดอะไรบางอย่างชัดเจนที่นี่?

ฉันพยายามตั้งค่า Type = simple ด้วย Restart = on-failure แต่ในหลายกรณีฉันต้องการพฤติกรรมดังต่อไปนี้ (จาก manpage) ที่บริการ oneshot ให้:

พฤติกรรมของวัตถุที่คล้ายคลึงกันง่าย ๆ ; อย่างไรก็ตามคาดว่ากระบวนการจะต้องออกก่อนที่ systemd จะเริ่มหน่วยติดตาม

ปรับปรุง:


วิธีแก้ปัญหาหนึ่งที่ฉันใช้คือการละเว้นRestartและห่อmy_cmd เช่นนี้: ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'พร้อมกับTimeoutStartSecค่าที่เหมาะสม
rozcietrzewiacz

คุณดูFailureAction =หรือไม่ อาจจะสามารถบรรลุสิ่งเดียวกันRestart=โดยการตั้งค่าFailureAction=[self.unit](แทนที่ [self.unit] ด้วยชื่อของหน่วย) เป็นการแฮ็ก แต่อย่างน้อยก็ชัดเจนและง่ายต่อการติดตาม
Centimane

@Centimane FailureActionใช้ค่าเดียวกันกับStartLimitActionและทั้งหมดยกเว้นnoneทริกเกอร์การปิดบางประเภท
jpkotta

คำตอบ:


5

วิธีแก้ปัญหาหนึ่งที่เป็นไปได้ที่ฉันพยายามคือ

  [Unit]
    Description=Tags instance and EBS vols
    After=docker.service
    Requires=docker.service

    [Service]
    ExecStartPre=/usr/bin/docker run --rm -v /opt/tag.sh:/tag.sh -v /opt:/ack --entrypoint=/bin/sh alpine /tag.sh
    ExecStartPre=/usr/bin/sh -c '[[ -e /opt/TAG_SUCCESS ]]'
    ExecStart=/usr/bin/rm /opt/TAG_SUCCESS
    Restart=on-failure
    RestartSec=30

ตำแหน่งที่สคริปต์tag.shจะtouch /ack/TAG_SUCCESSสิ้นสุดการทำงาน ฉันเชื่อว่าสิ่งนี้ใกล้เคียงกับพฤติกรรมที่ต้องการเพราะExecStartPreจะดำเนินการตามลำดับรอความสำเร็จก่อนที่จะโทรExecStartและหน่วยจะได้รับการพิจารณาเพียงStartingครั้งเดียวExecStartจะถูกเรียกตามจุดที่เรามั่นใจว่าเราได้เสร็จสิ้นภารกิจเริ่มต้นแล้ว

แต่สิ่งนี้ยังรู้สึกเหมือนถูกแฮ็คยักษ์?


สิ่งนี้ทำงานได้ดีสำหรับฉันยกเว้นว่าฉันต้องตั้งค่าRemainAfterExit=yesให้หน่วยอยู่ในสถานะ "แอคทีฟ" เพื่อให้หน่วยอื่นสามารถพึ่งพาได้
Guss
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.