ใน systemd ความแตกต่างระหว่าง After = และ Need = คืออะไร


53

ฉันสร้างไฟล์ .service systemd และฉันต้องการความช่วยเหลือในการทำความเข้าใจความแตกต่างระหว่างและRequires= หน้าคนบอกว่า"กำหนดค่าอ้างอิงความต้องการในหน่วยงานอื่น ๆ ." และ"กำหนดค่าการอ้างอิงการสั่งซื้อระหว่างหน่วย" ความแตกต่างคืออะไร?After=Requires=After=

คำตอบ:


43

After=กำหนดค่าใบสั่งบริการ (ทำ X เฉพาะหลังจาก Y) ในขณะที่การRequires=พึ่งพาของรัฐ หากคุณไม่ระบุคำสั่งซื้อบริการที่ขึ้นอยู่กับอีกบริการหนึ่งจะเริ่มในเวลาเดียวกับที่สั่งซื้อ นอกจากนี้วิธีที่ฉันเข้าใจ (แม้ว่าฉันไม่สามารถทดสอบได้ในขณะนี้และไม่พบการอ้างอิง) After=คือ "ข้อต่อหลวม" และบริการที่มีคำสั่งดังกล่าวจะยังคงทำงานหากชื่อที่อยู่ในAfter=บรรทัดนั้นไม่ทำงาน ไม่เริ่มเลยในขณะที่Require=จะป้องกันไม่ให้มันเริ่มถ้าไม่เป็นไปตามข้อกำหนด

อ้างถึงhttps://www.freedesktop.org/software/systemd/man/systemd.unit.html :

ต้อง =

กำหนดค่าการพึ่งพาความต้องการในหน่วยอื่น ๆ หากหน่วยนี้เปิดใช้งานหน่วยที่แสดงในที่นี้จะเปิดใช้งานเช่นกัน หากหนึ่งในหน่วยอื่น ๆ ถูกปิดการใช้งานหรือการเปิดใช้งานล้มเหลวหน่วยนี้จะถูกปิดการใช้งาน ตัวเลือกนี้อาจระบุได้มากกว่าหนึ่งครั้งหรืออาจมีการระบุหน่วยที่คั่นด้วยช่องว่างหลายรายการในหนึ่งตัวเลือกซึ่งการขึ้นอยู่กับความต้องการของกรณีสำหรับชื่อที่แสดงทั้งหมดจะถูกสร้างขึ้น โปรดทราบว่าการพึ่งพาความต้องการไม่ได้มีผลต่อลำดับในการเริ่มต้นหรือหยุดให้บริการ สิ่งนี้จะต้องถูกกำหนดค่าอย่างอิสระด้วยตัวเลือก After = or Before = หากยูนิต foo.service ต้องการยูนิต bar.service ตามที่กำหนดค่าไว้ด้วย Need = และไม่มีการกำหนดค่าการสั่งซื้อด้วย After = หรือ Before = จากนั้นทั้งสองหน่วยจะเริ่มพร้อมกันและไม่มีการหน่วงเวลาระหว่างกันหาก foo.service เปิดใช้งาน บ่อยครั้ง,

และ

ก่อน =, หลัง =

รายการชื่อยูนิตที่คั่นด้วยช่องว่าง กำหนดค่าการเรียงลำดับการพึ่งพาระหว่างหน่วย หากหน่วย foo.service มีการตั้งค่า Before = bar.service และทั้งสองหน่วยกำลังเริ่มต้นการเริ่มต้นของ bar.service จะล่าช้าจนกว่า foo.service จะเริ่มขึ้น โปรดทราบว่าการตั้งค่านี้เป็นอิสระจากกันและตั้งฉากกับการพึ่งพาความต้องการตามที่กำหนดโดยต้อง = เป็นรูปแบบทั่วไปที่รวมชื่อหน่วยในตัวเลือก After = and Need = ซึ่งในกรณีนี้จะมีการเริ่มหน่วยที่แสดงรายการไว้ก่อนหน่วยที่กำหนดค่าด้วยตัวเลือกเหล่านี้ ตัวเลือกนี้อาจมีการระบุมากกว่าหนึ่งครั้งซึ่งในกรณีที่การสั่งซื้อการอ้างอิงสำหรับชื่อที่ระบุไว้ทั้งหมดจะถูกสร้างขึ้น After = เป็นค่าผกผันของ Before = คือขณะที่ After = ทำให้มั่นใจได้ว่ายูนิตที่กำหนดค่าเริ่มทำงานหลังจากหน่วยที่แสดงรายการเสร็จสิ้นการเริ่มทำงาน Before = ทำให้แน่ใจว่าตรงกันข้าม หน่วยที่กำหนดค่าเริ่มต้นอย่างสมบูรณ์ก่อนที่หน่วยที่ระบุไว้จะเริ่มขึ้น โปรดทราบว่าเมื่อมีการปิดตัวลงสองหน่วยที่มีการพึ่งพาการสั่งซื้อระหว่างกันระบบจะใช้การผกผันของคำสั่งเริ่มต้น กล่าวคือถ้ายูนิตถูกกำหนดค่าด้วย After = บนยูนิตอื่นยูนิตเก่าจะหยุดทำงานก่อนหน้าหลังหากทั้งสองถูกปิดระบบ ให้สองหน่วยที่มีการพึ่งพาการสั่งซื้อใด ๆ ระหว่างพวกเขาหากหน่วยหนึ่งถูกปิดลงและอื่น ๆ จะเริ่มขึ้นการสั่งปิดเป็นก่อนที่จะเริ่มต้นขึ้น มันไม่สำคัญว่าการพึ่งพาการสั่งซื้อคือหลังจาก = หรือก่อน = มันไม่สำคัญว่าทั้งสองจะปิดตัวลงตราบใดที่หนึ่งถูกปิดและอื่น ๆ จะเริ่มขึ้น สั่งปิดเครื่องก่อนที่จะเริ่มขึ้นในทุกกรณี หากทั้งสองหน่วยไม่มีการสั่งซื้อการพึ่งพาระหว่างกันพวกเขาจะปิดหรือเริ่มต้นพร้อมกัน


7
การพึ่งพาหากไม่ได้เป็นคำสั่งคืออะไร? (อย่างจริงจัง ... ฉันไม่เข้าใจความแตกต่าง)
TomOnTime

ดูการแก้ไขของฉัน ความเข้าใจของฉัน: After=Xจะหมายถึง "ทำสิ่งนี้หลังจาก X ถ้า X เสร็จแล้ว" ในขณะที่Require=Xหมายความว่า "อย่าทำอย่างนี้เลยถ้าคุณทำ X ไม่ได้"
สเวน

Before=ส่วนของหน้าคนที่ดูเหมือนจะยืนยันเรื่องนี้ If a unit foo.service contains a setting Before=bar.service and both units are being started, bar.service's start-up is delayed until foo.service is started up วิธีที่ฉันเข้าใจว่าการสั่งซื้อจะไม่ถูกบังคับถ้าbar.serviceยังไม่เริ่มและfoo.serviceจะเริ่มตามปกติ
สเวน

9

หนึ่งในความแตกต่างที่สำคัญคือ

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

พิจารณาฉันมีไฟล์หน่วยtest-app.service,

[Unit]
Description=test app
After=network-online.target

นี่คือสิ่งที่จะเกิดขึ้นเมื่อมีการใช้คำสั่งนี้

  • Afternetwork-online.targetตรวจสอบว่า
  • หากnetwork-online.targetไม่เริ่มต้นจะรอ
  • test-appเริ่มหลังจากเปิดnetwork-online.targetใช้งาน

ถ้าฉันมีRequiresแทน

[Unit]
Description=test app
Requires=network-online.target

นี่คือสิ่งที่จะเกิดขึ้นเมื่อมีการใช้คำสั่งนี้

  • network-online.targetและtest-appเปิดใช้งานด้วยกัน
  • หากnetwork-online.targetล้มเหลวในการเริ่มต้นtest-appจะไม่ถูกเปิดใช้งาน

2

systemd เป็นผู้จัดการงาน หน้าคนไม่แม่นยำมากเป็นสิ่งที่ทำงาน

เมื่อคุณบูตสิ่งที่ systemd ทำคือการสร้างธุรกรรมที่ประกอบด้วยงานสำหรับงาน anchor (เช่นงานเริ่มต้นสำหรับ default.target) สิ่งที่การพึ่งพาและความสัมพันธ์เหล่านี้ทำคือการกำหนดวิธีการทำงาน การสั่งซื้อจะกำหนดว่างานใดที่จะรอ หน่วย default.target จึงเป็นศูนย์กลางของทั้งหมดนี้ซึ่งเป็นเหตุผลที่เมื่อเปิดใช้งานหน่วยที่คุณใช้การพึ่งพาย้อนกลับซึ่งผ่าน systemctl เปิดใช้งานการสร้างการเชื่อมโยงสัญลักษณ์ระบบแฟ้มแสดงถึงการพึ่งพาไปข้างหน้า systemd สามารถปฏิบัติตาม ที่แรก). ที่คล้ายกันคือเมื่อคุณเริ่มบางหน่วยด้วยตนเองจากนั้นหน่วยที่ยึดและการทำธุรกรรมจะถูกคำนวณมัน

ฉันจะอธิบายสิ่งที่ต้องทำ = และ After =

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

ตอนนี้แนะนำให้ใช้ After = ตามต้องการ = alone คือความมีชีวิตชีวาสำหรับสิ่งที่มันทำ: ยกเลิกความต้องการหากงานเริ่มต้นล้มเหลว การยกเลิกนี้ใช้ได้เฉพาะกับงาน wrt เท่านั้นเช่นหากหน่วยอื่นไม่ได้กำหนดการสั่งซื้อ systemd จะทริกเกอร์ทั้งคู่ขนานและหากงานเริ่มต้นเสร็จสิ้นก่อนที่งานเริ่มต้นของคุณจะล้มเหลวก็จะไม่ถูกยกเลิก (อันที่จริงแล้วไม่สามารถยกเลิกได้) . การใช้ After = หมายถึงงานอื่น ๆ รอต่อไปจนกระทั่งงานเริ่มของหน่วยที่ต้องการเสร็จสิ้นและขึ้นอยู่กับผลลัพธ์หากล้มเหลวงานเริ่มต้นการรอของหน่วยของคุณจะถูกยกเลิกด้วยผลงาน JOB_DEPENDENCY (ทำไมคุณใช้สีเหลือง [DEPEND] ที่บูตสำหรับกรณีดังกล่าว) ดังนั้นผลการทำให้เป็นโมฆะนี้ไม่ได้กำหนดไว้โดยไม่ใช้ After =

นี่คือเหตุผลที่ใช้ Wants = ไม่มี After = เป็นเรื่องปกติถ้าคุณไม่ต้องการรอการเริ่มต้นของหน่วยอื่น: เนื่องจากไม่มีการทำให้ใช้งานไม่ได้ดังนั้นจึงไม่มีการแข่งขัน ในกรณีนี้มันไม่ได้เป็นมากกว่ากลไกการประสาน

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

ตอนนี้หากไม่มีงานการสั่งซื้อจะไม่มีผลกับหน่วยงานดังกล่าว อย่างไรก็ตามมักจะมีงานเป็นผลมาจากการใช้การพึ่งพาเช่น Need = และ Wants = หรือทั้งสองได้รับการดึงในเวลาและกำหนดบางคำสั่งซึ่งในกรณีที่พวกเขารองานของหน่วยอื่น

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