ฉันกำลังเขียนsystemdไฟล์หน่วยแรกของฉัน
สำหรับTypeมีตัวเลือกไม่กี่: forking, simpleฯลฯ ฉันได้อ่านเอกสาร Redhatในหัวข้อนี้ (ตารางที่ 9.9) แต่ก็ยังไม่แน่ใจว่าเมื่อใดฉันควรใช้ตัวเลือกใด
แนวทางใด?
ฉันกำลังเขียนsystemdไฟล์หน่วยแรกของฉัน
สำหรับTypeมีตัวเลือกไม่กี่: forking, simpleฯลฯ ฉันได้อ่านเอกสาร Redhatในหัวข้อนี้ (ตารางที่ 9.9) แต่ก็ยังไม่แน่ใจว่าเมื่อใดฉันควรใช้ตัวเลือกใด
แนวทางใด?
คำตอบ:
เมื่อคุณเริ่มบริการด้วยตนเองจากบรรทัดคำสั่ง (โดยไม่ใช้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พฤติกรรมประเภทจะดีกว่าสำหรับ
apachectl startในฐานะรูท ลองทำแล้วดูว่าเกิดอะไรขึ้น จากนั้นเลือก a), b) หรือ c) จากคำตอบของฉัน ฉันเดิมพันว่าพรอมต์ส่งคืนและ Apache ยังคงทำงานอยู่ดังนั้นข) จะเป็นคำตอบ
Type=notifyไหม
Type=notifyเพิ่ม
apacheควรใช้ชนิดใด