ระบบ init หนึ่งระบบสามารถใช้งานได้พร้อมกัน ในวันที่ 16.04 นั่นคือ systemd
จำนวนแพ็กเกจมาพร้อมกับไฟล์สำหรับระบบเริ่มต้นหลายระบบดังนั้นจึงสามารถจัดการกับระบบเริ่มต้นหลายระบบบนระบบปฏิบัติการที่แตกต่างกัน บน Ubuntu บางครั้งสคริปต์สำหรับระบบ init หลายระบบจะถูกติดตั้งแม้ว่าจะไม่ได้ใช้งานทั้งหมดในเวลาเดียวกัน
ระบบ init รุ่นใหม่พยายามที่จะรักษาความเข้ากันได้กับระบบเก่า โดยเฉพาะอย่างยิ่ง systemd พยายามที่จะรักษาความเข้ากันได้กับสคริปต์เริ่มต้นทั้ง Upstart และ SysV
ในกรณีของสคริปต์ "init.d" ที่คุณพูดถึงนั่นคือสคริปต์ init "SysV" ไม่ใช่สคริปต์พุ่งพรวด นอกจากนี้สคริปต์เริ่มต้นของ "SysV" จะเริ่มทำงานเมื่อบูตหากเชื่อมโยงไปยังไดเรกทอรีเช่น "/etc/rc5.d" เท่านั้น คุณจะพบว่าตัวจัดการเครือข่ายไม่มี symlink ติดตั้งอยู่ที่นั่น
หากต้องการทำความเข้าใจวิธีsystemd
จัดการสคริปต์เริ่มต้นของ "SysV" ดูที่systemd ใช้ /etc/init.d scirpts อย่างไร .
ตอนนี้เพื่อตอบคำถามเกี่ยวกับสาเหตุที่ทำให้รีสตาร์ท Network Manager ด้วย "service network-manager restart" service
คำสั่งที่ใช้กับทั้งสคริปต์พุ่งพรวดและ SysV สคริปต์ init เลือกอดีต /etc/init/network-manager.conf
ผู้จัดการเครือข่ายนอกจากนี้ยังมีสคริปต์พุ่งพรวดติดตั้งบนที่ 16.04
หากคุณตรวจสอบผลลัพธ์ของsudo strace service network-manager restart
คุณจะได้รับความรู้สึกของสิ่งที่เกิดขึ้น อันดับแรกเอาต์พุตแสดงว่าsystemctl
กำลังถูกเรียกใช้เพื่อระบุว่าคำสั่งกำลังถูกเปลี่ยนเส้นทางไปยัง systemd ก่อนอื่นไม่นานหลังจากที่เปิดขึ้น/usr/bin/service
มาคุณจะเห็นว่ามันเริ่มอ่านในไฟล์เป็นเชลล์สคริปต์:
open("/usr/sbin/service", O_RDONLY) = 3
...
read(10, "#!/bin/sh\n\n#####################"..., 8192) = 8192
ตอนนี้เรารู้แล้วว่าservice
เป็นเชลล์สคริปต์เราสามารถไปดูซอร์สโค้ดของมันได้ ในซอร์สโค้ดเราพบว่าis_systemd
มีการตรวจพบและตั้งค่า สำหรับกรณี systemd systemctl restart network-manager
คุณสามารถเห็นได้ว่าคำสั่งที่ได้รับการเขียนใหม่ให้เป็น
ดังนั้นในขณะที่ระบบเริ่มต้นทั้งสามนั้นมีอยู่จริงและมีความเข้ากันได้บ้างก็มีความซับซ้อนหลายระดับ เพื่อลดความซับซ้อนของสิ่งที่เกิดขึ้นในอนาคตควรใช้ไฟล์ systemd unit และsystemctl
เครื่องมือในการจัดการบริการ