Score:1

เป็นไปได้หรือไม่ที่จะใช้ทั้งตัวเลือก `After=` และ `Before=` สำหรับหน่วยเดียวกัน (บริการ) ร่วมกันในบริการ systemd

ธง in

เดอะ Type=วันช็อต หน่วย ก.บริการ เริ่มต้นทุกชั่วโมงโดย ก.ไทเมอร์ และมัน ต้องการ = B. บริการแต่วิ่ง ก่อน=B.บริการ. หน่วย ข. บริการ ยังเป็น Type=วันช็อต. ข้อกำหนดที่นี่คือกระบวนการของพวกเขาไม่ควรทับซ้อนกันในขณะทำงาน (ภาพเดียว รับประกันว่าอย่างนั้น) ทั้งหมดนี้ยอดเยี่ยมมาก ตอนนี้ลองนึกภาพสถานการณ์ที่ทั้งสอง และ วิ่งกันนานกว่าชั่วโมง (เวลาระหว่าง ก.ไทเมอร์ ไฟ). มีความเป็นไปได้สองประการที่นี่:

  1. วิ่งมากกว่าหนึ่งชั่วโมงแล้วแม้ว่า ก.ไทเมอร์ ต้องการที่จะยิงและมันอาจจะทำโดยไม่คำนึงถึงอีกตัวอย่างหนึ่งของ จะยังไม่เริ่มจนกว่าอันแรกจะเสร็จสิ้นเนื่องจากความเป็นเอกลักษณ์ของอินสแตนซ์บริการเป็นหนึ่งในหลักการพื้นฐานใน ระบบ. ฉันเชื่อว่ามันจะเป็นเพียงคิว อีกครั้ง ทั้งหมดนี้ดีมาก เราไม่มีความเสี่ยงของกระบวนการที่ทับซ้อนกันในขณะทำงานที่นี่
  2. วิ่งนานพอดังนั้น ซึ่งวิ่งหลังจากนั้นก็วิ่งนานพอที่จะรวมกันเกินหนึ่งชั่วโมง และเป็นผลให้ ก.ไทเมอร์ ไฟที่จะเริ่มต้นใหม่ ในขณะที่ ยังคงทำงานอยู่ นั่นคือจุดที่เราพบการทับซ้อนของกระบวนการเนื่องจากไม่มี After=B.service ใน ก.บริการ ตามที่มีแล้ว ก่อน=B.บริการ.

คำถามของฉันคือโดยพื้นฐานแล้วมันถูกต้องหรือไม่ที่จะมีทั้งสองอย่าง After=B.service และ ก่อน=B.บริการ ใน ก.บริการ ในที่แรก? และแน่นอน มันจะแก้ปัญหาการซ้อนทับที่อธิบายไว้ในความเป็นไปได้ที่สองตามที่ฉันคาดหวังในทางทฤษฎีหรือไม่ มีอีกไหม ระบบ- วิธีแก้ปัญหานี้ (เช่น ฉันไม่ต้องการมีส่วนร่วมกับการล็อกไฟล์ที่ผิดพลาดได้ง่าย)

Michael Hampton avatar
cz flag
คุณควรตั้งค่า `Condition...=` แทน
Score:2
ธง br

หากคุณสร้างไฟล์ ก่อน= และ หลังจาก= ในของคุณ ก.บริการ ไฟล์ คุณจะได้รับข้อผิดพลาด:

A.service: ลบงาน B.service/start เพื่อหยุดวงจรการสั่งซื้อที่เริ่มต้นด้วย A.service/start

เนื่องจาก Systemd ไม่ต้องการให้มีการพึ่งพาทั้งสองอย่างนั้นในหน่วยเดียวกัน ฉันไม่คิดว่าจะใด ๆ สภาพ...= จาก คน systemd.unit ที่ Michael กล่าวถึงนั้นเหมาะสมอย่างยิ่งสำหรับงานที่คุณกำลังพยายามทำให้สำเร็จ เว้นแต่คำสั่งของคุณจะสร้างและล้างไฟล์ของตัวเอง จากที่ฉันเห็น คุณมีวิธีแก้ไขที่เป็นไปได้หลักๆ สองทาง:

  1. สร้าง ExecCondition= ในของคุณ ก.บริการ ที่รันคำสั่งเพื่อตรวจสอบว่า ข. การบริการ กำลังวิ่ง.นี่เป็นเรื่องยุ่งยากเล็กน้อยที่จะทำเพียงแค่ ps และ grep จากภายในไฟล์หน่วยของคุณ ดังนั้นคุณอาจต้องการรันสคริปต์ภายนอก แต่คุณบอกแล้วว่าคุณต้องการหลีกเลี่ยงไฟล์ล็อคที่ยุ่งเหยิง ซึ่งนั่นอาจไม่เหมาะ
  2. ใช้โซลูชันล็อกไฟล์ยุ่งเหยิงที่คุณกล่าวถึงว่าคุณไม่ต้องการใช้
  3. ย้ายคำสั่งที่สองของคุณออกจาก ข. การบริการ และลงในก ExecStopPost= ตัวเลือกใน ก.บริการ. ซึ่งจะทำให้คำสั่งที่สองทำงานหลังจากคำสั่งแรกหยุดทำงานเท่านั้น นอกจากนี้ยังจะป้องกันไม่ให้เกิดใหม่ ก.บริการ จากการวิ่งก่อนที่ตัวแรกจะเสร็จ ข้าพเจ้าเชื่อว่าสิ่งนี้สำเร็จสมความปรารถนาของท่านทุกประการ เนื่องจากว่า ก.บริการ คำสั่งและ ข. การบริการ คำสั่งจะไม่ทำงานพร้อมกัน สอง ก.บริการ คำสั่งจะไม่ทำงานพร้อมกัน และการดำเนินการใหม่จะถูกจัดคิวไว้

นี่คือไฟล์หน่วยที่ฉันใช้เพื่อทดสอบตัวเลือก 3:

[หน่วย]
คำอธิบาย = A.service สำหรับข้อผิดพลาดของเซิร์ฟเวอร์
[บริการ]
ประเภท = oneshot
# ก.คำสั่งบริการ
ExecStart = /usr/bin/sleep 3 
# B.คำสั่งบริการ
ExecStopPost = /usr/bin/sleep 30

แล้วทดสอบโดยใช้ systemctl เริ่ม A.service ซ้ำๆ ในหน้าต่างเทอร์มินอลหลายตัว เพื่อติดตามความคืบหน้าของกระบวนการที่กำลังทำงานจริง ณ ช่วงเวลาใดเวลาหนึ่งด้วย ปล.

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา