systemd forking vs simple?


25

ฉันกำลังเขียนsystemdไฟล์หน่วยแรกของฉัน

สำหรับTypeมีตัวเลือกไม่กี่: forking, simpleฯลฯ ฉันได้อ่านเอกสาร Redhatในหัวข้อนี้ (ตารางที่ 9.9) แต่ก็ยังไม่แน่ใจว่าเมื่อใดฉันควรใช้ตัวเลือกใด

แนวทางใด?

คำตอบ:


48

เมื่อคุณเริ่มบริการด้วยตนเองจากบรรทัดคำสั่ง (โดยไม่ใช้nohupคำสั่งคำนำหน้าหรือ&คำต่อท้ายเพื่อเรียกใช้ในพื้นหลังหรือในคำอื่น ๆ เพียงแค่เรียกใช้คำสั่งที่คุณจะใส่ในExecStart=บรรทัดของ.serviceไฟล์) จะเกิดอะไรขึ้น

a)หากบริการเริ่มต้นและทำงานต่อไปและข้อความแจ้งจะไม่ส่งคืนจนกว่าคุณจะกด Control-C หรือหยุดบริการด้วยวิธีอื่น: Type = simpleเป็นตัวเลือกที่ถูกต้อง

b)หากพรอมต์กลับมา แต่บริการยังคงทำงานในพื้นหลัง (เช่นบริการ daemonizes ตัวเองด้วยตัวเอง) แล้วType = forkingเป็นทางเลือกที่เหมาะสม

c)ถ้าบริการทำงานและกลับไปที่พรอมต์โดยไม่ปล่อยให้สิ่งใดทำงาน (เช่นบริการเพิ่งปรับการตั้งค่าเคอร์เนลบางอย่างส่งคำสั่งไปยังสิ่งอื่นหรือทำสิ่งที่คล้ายกัน) Type = oneshotนั่นอาจเป็นตัวเลือกที่เหมาะสม ในกรณีนี้ExecStartบริการอาจเป็นคำสั่งให้ "ตั้งค่า" บางอย่างและExecStopจะเป็นคำสั่งที่เกี่ยวข้องกับ "unset" ประเภทนี้มักจะได้รับประโยชน์RemainAfterExit=trueดังนั้น systemd จะติดตาม "สถานะ" ของบริการนี้ตามที่ระบุว่าเป็น "set" หรือ "unset" ล่าสุดหรือไม่

Typeค่าอื่นเป็นกรณีพิเศษ ตัวอย่างเช่นหากบริการใช้การเชื่อมต่อ D-Bus Type = dbusอาจเป็นตัวเลือกที่ดีที่สุด มันทำให้systemdทราบถึงความจริงแล้ว systemd จะติดตามบริการนี้ (และสิ่งที่ขึ้นอยู่กับมัน) โดยการมีอยู่ของบริการนี้บน D-Bus

ในการใช้Type = notifyกระบวนการจะต้องสามารถเชื่อมต่อกับซ็อกเก็ต Unix ที่ระบุในตัวแปรสภาพแวดล้อม$NOTIFY_SOCKETและเพื่อรายงานสถานะโดยการเขียนข้อความไปยังซ็อกเก็ตนั้นเมื่อใดก็ตามที่จำเป็น นอกจากนี้ไฟล์บริการควรระบุNotifyAccessตัวเลือกในการให้สิทธิ์การเข้าถึงซ็อกเก็ตการแจ้งเตือนตามความเหมาะสม

มียูทิลิตีบรรทัดคำสั่งsystemd-notifyและฟังก์ชั่นไลบรารี C ที่sd_notify(3)คุณอาจใช้ในการส่งข้อความเหล่านี้ แต่หากไม่มีคุณสมบัติใดที่เหมาะสมกับความต้องการของคุณคุณสามารถใช้ผู้ส่งข้อความของคุณเองได้ ข้อความที่ต้องการนั้นง่ายมากและดูเหมือนว่าการกำหนดตัวแปรของเชลล์: ตัวอย่างเช่นเพื่อแจ้งว่าบริการเสร็จสิ้นการเริ่มต้นสำเร็จและพร้อมที่จะให้บริการคำขอขาเข้าใด ๆ บริการควรส่งสตริงที่เทียบเท่ากับผลลัพธ์ของprintf "READY=1\n"ซ็อกเก็ต ดูman 3 sd_notifyรายละเอียดเพิ่มเติมเกี่ยวกับข้อความที่รู้จัก

หมายเหตุ: แอปพลิเคชันบริการจำนวนมากที่ออกแบบมาให้พกพาไปยังระบบ Unix หลายสไตล์อาจทำงานเป็น b) โดยค่าเริ่มต้น แต่สามารถทำงานได้เหมือน) โดยการเพิ่มตัวเลือก (โดยปกติจะอธิบายว่า "ไม่แยก", "ทำงานต่อไป ในเบื้องหน้า "," อย่า daemonize "หรือคล้ายกัน) ในกรณีที่ถ้าตัวเลือกที่มีผลข้างเคียงอื่น ๆ แล้วการเพิ่มตัวเลือกและการใช้ที่) systemdพฤติกรรมประเภทจะดีกว่าสำหรับ


สมมติว่าฉันเริ่มapacheควรใช้ชนิดใด
kittygirl

2
คุณจะเริ่มต้นด้วยตนเองได้อย่างไร ด้วยการรันapachectl startในฐานะรูท ลองทำแล้วดูว่าเกิดอะไรขึ้น จากนั้นเลือก a), b) หรือ c) จากคำตอบของฉัน ฉันเดิมพันว่าพรอมต์ส่งคืนและ Apache ยังคงทำงานอยู่ดังนั้นข) จะเป็นคำตอบ
telcoM

ฉันชอบคำอธิบายที่คุณให้ไว้ในคำตอบของคุณ คุณจะเพิ่มคำอธิบายภาษาอังกฤษแบบธรรมดาสำหรับกรณีของอีกType=notifyไหม
Yankee

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