เรียกใช้คำสั่งโดยพลการเมื่อบริการล้มเหลว


12

ฉันต้องการเรียกใช้สคริปต์บางอย่างเมื่อบริการล้มเหลว สิ่งที่ใกล้เคียงที่สุดที่ฉันเห็นคือFailureAction=ตัวเลือก (ใต้[Service]หัวข้อ) แต่มีเพียงคำสั่งรีบูต

คำตอบ:


11

มีเป็นOnFailure=คำสั่งในส่วน[Unit]เอกสารในsystemd.unit (5) มันถูกกำหนดไว้ดังนี้:

รายการที่คั่นด้วยช่องว่างของหนึ่งหน่วยขึ้นไปที่เปิดใช้งานเมื่อหน่วยนี้เข้าสู่สถานะ "ล้มเหลว"

(นอกจากนี้ยังมีOnFailureJobMode=คำสั่งในส่วนเดียวกันซึ่งอนุญาตให้ตั้งค่าโหมดงานสำหรับเปิดใช้งาน OnFailure = หน่วย)


ดูเหมือนว่าตัวเลือกเหล่านั้นจะเริ่มหน่วยอื่น ๆ แทนที่จะเป็นเพียงสคริปต์
tshepang

2
@Tepepang: แน่นอน ใน systemd หน่วยคือดีหน่วยพื้นฐานของการทำอะไร เขียนหน่วยง่ายๆสำหรับสคริปต์ของคุณวางไว้ข้างใต้/etc/systemd/systemและวางชื่อไว้ในOnFailure=คำสั่ง
intelfx

2

คุณยังสามารถใช้ExecStopPostเพื่อเรียกใช้คำสั่งโดยตรงแทนการเริ่มหน่วย

ผมไม่ได้มีความสุขกับการตั้งค่าเพื่อให้ฉันเก็บไว้ดูและพบว่าOnFailureExecStopPost

ตัวอย่างจริงต่อไปนี้หากงานหลักล้มเหลว systemd จะเรียกใช้gitคำสั่ง

[Unit]
Description=SRI Dispenser Server
ConditionPathExists=|/usr/bin/
After=sri-boot-dsp.service

[Service]
WorkingDirectory=/usr/share/sri/configurations/transmitter

User=root

# This is task to run when this service starts
ExecStart=/usr/bin/python -m sri.DispenserServer

# If any of the ExecStart tasks fail, then ExecStopPost will run
ExecStopPost=/bin/git checkout -- .

Restart=always
RestartSec=10
KillSignal=SIGKILL


[Install]
WantedBy=multi-user.target

https://www.freedesktop.org/software/systemd/man/systemd.service.html

ExecStopPost = คำสั่งเพิ่มเติมที่ดำเนินการหลังจากหยุดให้บริการ ซึ่งรวมถึงกรณีที่มีการใช้คำสั่งที่กำหนดค่าใน ExecStop = โดยที่บริการไม่ได้กำหนด ExecStop = ไว้หรือมีการออกบริการโดยไม่คาดหมาย อาร์กิวเมนต์นี้ใช้หลายบรรทัดคำสั่งตามโครงร่างเดียวกับที่อธิบายไว้สำหรับ ExecStart = การใช้การตั้งค่าเหล่านี้เป็นทางเลือก สนับสนุนการแทนที่ตัวแปรตัวระบุและสภาพแวดล้อม โปรดทราบว่า - ซึ่งแตกต่างจาก ExecStop = - คำสั่งที่ระบุด้วยการตั้งค่านี้จะถูกเรียกใช้เมื่อบริการล้มเหลวในการเริ่มต้นอย่างถูกต้องและถูกปิดอีกครั้ง

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

โปรดทราบว่าคำสั่งทั้งหมดที่กำหนดค่าด้วยการตั้งค่านี้จะถูกเรียกใช้พร้อมกับรหัสผลลัพธ์ของบริการรวมทั้งรหัสทางออกและสถานะของกระบวนการหลักที่ตั้งค่าไว้ในตัวแปรสภาพแวดล้อม $ SERVICE_RESULT, $ EXIT_CODE และ $ EXIT_STATUS ดู systemd.exec (5) สำหรับรายละเอียด

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