หากคุณสร้างไฟล์ ก่อน=
และ หลังจาก=
ในของคุณ ก.บริการ
ไฟล์ คุณจะได้รับข้อผิดพลาด:
A.service: ลบงาน B.service/start เพื่อหยุดวงจรการสั่งซื้อที่เริ่มต้นด้วย A.service/start
เนื่องจาก Systemd ไม่ต้องการให้มีการพึ่งพาทั้งสองอย่างนั้นในหน่วยเดียวกัน ฉันไม่คิดว่าจะใด ๆ สภาพ...=
จาก คน systemd.unit
ที่ Michael กล่าวถึงนั้นเหมาะสมอย่างยิ่งสำหรับงานที่คุณกำลังพยายามทำให้สำเร็จ เว้นแต่คำสั่งของคุณจะสร้างและล้างไฟล์ของตัวเอง จากที่ฉันเห็น คุณมีวิธีแก้ไขที่เป็นไปได้หลักๆ สองทาง:
- สร้าง
ExecCondition=
ในของคุณ ก.บริการ
ที่รันคำสั่งเพื่อตรวจสอบว่า ข. การบริการ
กำลังวิ่ง.นี่เป็นเรื่องยุ่งยากเล็กน้อยที่จะทำเพียงแค่ ps และ grep จากภายในไฟล์หน่วยของคุณ ดังนั้นคุณอาจต้องการรันสคริปต์ภายนอก แต่คุณบอกแล้วว่าคุณต้องการหลีกเลี่ยงไฟล์ล็อคที่ยุ่งเหยิง ซึ่งนั่นอาจไม่เหมาะ
- ใช้โซลูชันล็อกไฟล์ยุ่งเหยิงที่คุณกล่าวถึงว่าคุณไม่ต้องการใช้
- ย้ายคำสั่งที่สองของคุณออกจาก
ข. การบริการ
และลงในก ExecStopPost=
ตัวเลือกใน ก.บริการ
. ซึ่งจะทำให้คำสั่งที่สองทำงานหลังจากคำสั่งแรกหยุดทำงานเท่านั้น นอกจากนี้ยังจะป้องกันไม่ให้เกิดใหม่ ก.บริการ
จากการวิ่งก่อนที่ตัวแรกจะเสร็จ ข้าพเจ้าเชื่อว่าสิ่งนี้สำเร็จสมความปรารถนาของท่านทุกประการ เนื่องจากว่า ก.บริการ
คำสั่งและ ข. การบริการ
คำสั่งจะไม่ทำงานพร้อมกัน สอง ก.บริการ
คำสั่งจะไม่ทำงานพร้อมกัน และการดำเนินการใหม่จะถูกจัดคิวไว้
นี่คือไฟล์หน่วยที่ฉันใช้เพื่อทดสอบตัวเลือก 3:
[หน่วย]
คำอธิบาย = A.service สำหรับข้อผิดพลาดของเซิร์ฟเวอร์
[บริการ]
ประเภท = oneshot
# ก.คำสั่งบริการ
ExecStart = /usr/bin/sleep 3
# B.คำสั่งบริการ
ExecStopPost = /usr/bin/sleep 30
แล้วทดสอบโดยใช้ systemctl เริ่ม A.service
ซ้ำๆ ในหน้าต่างเทอร์มินอลหลายตัว เพื่อติดตามความคืบหน้าของกระบวนการที่กำลังทำงานจริง ณ ช่วงเวลาใดเวลาหนึ่งด้วย ปล
.