ฉันกำลังเขียน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
ควรใช้ชนิดใด