อ่าน 11 นาที
เปิดตัว
launchd คือ ดีมอน สำหรับการเริ่มต้นระบบ และ จัดการบริการระบบปฏิบัติการ ที่สร้างโดย Apple Inc.
เปิดตัว
| เปิดตัว | |
|---|---|
| ผู้เขียนต้นฉบับ | เดฟ ซาร์ซีคกี้ |
| นักพัฒนา | บริษัท แอปเปิล อิงค์ |
| ปล่อย | 29 เมษายน 2548 |
| เขียนเป็น | ซี |
| ระบบปฏิบัติการ | macOS , iOS , iPadOS , watchOS , tvOS , VisionOS |
| พิมพ์ | เริ่มต้นเดมอน |
| ใบอนุญาต | ซอฟต์แวร์กรรมสิทธิ์ (เดิมคือAPSLและต่อมาคือApache License 2.0 ) |
| เว็บไซต์ | opensource |
launchdคือดีมอนสำหรับการเริ่มต้นระบบและจัดการบริการระบบปฏิบัติการ ที่สร้างโดยApple Inc.ซึ่งเป็นส่วนหนึ่งของmacOS , iOS , iPadOS , watchOS , tvOSและvisionOSเพื่อทดแทนinitและSystemStarter ในรูปแบบ BSD มีความพยายามที่จะพอร์ต launchd ไปยังFreeBSDและระบบที่พัฒนาต่อยอดจาก FreeBSD
ส่วนประกอบ
ระบบ launchd ประกอบด้วยโปรแกรมหลักสองโปรแกรม ได้แก่ launchd และ launchctl
launchdทำหน้าที่จัดการ daemon ทั้งในระดับระบบและระดับผู้ใช้ คล้ายกับ xinetd, launchd สามารถเริ่ม daemon ได้ตามต้องการ และคล้ายกับ watchdogd, launchd สามารถตรวจสอบ daemon เพื่อให้แน่ใจว่าพวกมันยังคงทำงานอยู่ นอกจากนี้ launchd ยังเข้ามาแทนที่ init ในฐานะPID 1 บน macOS และด้วยเหตุนี้จึงมีหน้าที่รับผิดชอบในการเริ่มระบบเมื่อบูตเครื่อง
ไฟล์การกำหนดค่าจะกำหนดพารามิเตอร์ของบริการที่ทำงานโดย launchd ไฟล์เหล่านี้จัดเก็บอยู่ในไดเร็กทอรีย่อย LaunchAgents และ LaunchDaemons ภายในโฟลเดอร์ Library โดย ไฟล์ประเภท property listจะมีคีย์ที่แตกต่างกันประมาณสามสิบคีย์ที่สามารถตั้งค่าได้ launchd เองไม่รู้จักไฟล์การกำหนดค่าเหล่านี้หรือความสามารถในการอ่านไฟล์เหล่านั้น หน้าที่นั้นเป็นของ "launchctl"
launchctlเป็นแอปพลิเคชันบรรทัดคำสั่งที่สื่อสารกับ launchd โดยใช้IPCและรู้วิธีการแยกวิเคราะห์ ไฟล์ รายการคุณสมบัติที่ใช้ในการอธิบายงานของ launchd โดยแปลงเป็นรูปแบบอนุกรมโดยใช้โปรโตคอลพจนานุกรมเฉพาะที่ launchd เข้าใจ launchctl สามารถใช้เพื่อโหลดและยกเลิกการโหลดดีมอน เริ่มและหยุดงานที่ควบคุมโดย launchd รับสถิติการใช้งานระบบสำหรับ launchd และกระบวนการย่อย และตั้งค่าสภาพแวดล้อมได้
เปิดตัว
launchd มีหน้าที่หลักสองอย่าง อย่างแรกคือการบูตระบบ และอย่างที่สองคือการโหลดและบำรุงรักษาระบบบริการต่างๆ
นี่คือภาพรวมอย่างง่ายของการเริ่มต้นระบบ Mac OS X Tiger บน เครื่อง Mac ที่ ใช้โปรเซสเซอร์ PowerPC (บนเครื่อง Mac ที่ ใช้โปรเซสเซอร์ Intel นั้น EFIจะเข้ามาแทนที่Open Firmwareและboot.efiแทนที่BootX ):
- โปรแกรม Open Firmwareจะเปิดใช้งาน เริ่มต้นการทำงานของฮาร์ดแวร์ จากนั้นจึงโหลด BootX
- BootXจะโหลดเคอร์เนล หมุนเคอร์เซอร์แบบพินวีล และโหลดส่วนขยายเคอร์เนล (kexts) ที่จำเป็น
- เคอร์เนลจะโหลด launchd
- launchd จะรัน
/etc/rcสคริปต์ต่างๆ ที่สแกนไฟล์ plist/System/Library/LaunchDaemonsและ/Library/LaunchDaemonsเรียกใช้ launchctl กับไฟล์ plist ตามความจำเป็น จากนั้น launchd จะเริ่มหน้าต่างล็อกอิน
ในขั้นตอนที่ 4 สคริปต์เริ่มต้นจะสแกนหาไดเร็กทอรีต่างๆ เพื่อค้นหางานที่จะดำเนินการ โดยมีไดเร็กทอรีที่ถูกสแกนอยู่สองแห่ง:
- ไดเร็กทอรี LaunchDaemons ประกอบด้วยรายการที่จะทำงานในฐานะผู้ใช้ root ซึ่งโดยทั่วไปจะเป็นกระบวนการทำงานเบื้องหลัง
- ไดเร็กทอรี LaunchAgents ประกอบด้วยงานที่เรียกว่าแอปพลิเคชันเอเจนต์ ซึ่งจะทำงานในฐานะผู้ใช้หรือในบริบทของระบบผู้ใช้ งานเหล่านี้อาจเป็นสคริปต์หรือรายการที่ทำงานเบื้องหน้าอื่นๆ และอาจรวมถึงส่วนติดต่อผู้ใช้ด้วย
ไฟล์เหล่านี้ทั้งหมดจะถูกเก็บไว้ในโฟลเดอร์ Library ทั่วไปของ Mac OS X
launchd แตกต่างจาก SystemStarter อย่างมากตรงที่มันอาจไม่ได้เรียกใช้งาน daemon ทั้งหมดในระหว่างการบูตเครื่อง หัวใจสำคัญของ launchd และคล้ายกับ xinetd คือแนวคิดของการเรียกใช้งาน daemon ตามความต้องการ เมื่อ launchctl สแกนผ่าน plist ของงานในระหว่างการบูตเครื่อง มันจะขอให้ launchd จองและรับฟังพอร์ตทั้งหมดที่งานเหล่านั้นร้องขอ หากระบุไว้ใน plist ด้วยคีย์ "OnDemand" daemon จะไม่ถูกโหลดในขณะนั้น แต่ launchd จะรับฟังพอร์ต เรียกใช้งาน daemon เมื่อจำเป็น และปิดมันลงเมื่อไม่จำเป็นอีกต่อไป หลังจากโหลด daemon แล้ว launchd จะติดตามมันและตรวจสอบให้แน่ใจว่ามันทำงานอยู่หากจำเป็น ในลักษณะนี้มันคล้ายกับ watchdogd และมีข้อกำหนดร่วมกับ watchdogd ที่ว่ากระบวนการต่างๆ จะต้องไม่พยายามแยกตัวหรือทำงานเป็น daemon ด้วยตัวเอง หากกระบวนการใดทำงานอยู่เบื้องหลัง launchd จะสูญเสียการติดตามและพยายามเรียกใช้งานใหม่
ด้วยเหตุนี้ Mac OS X Tiger จึงบูตได้เร็วกว่ารุ่นก่อนหน้ามาก ระบบจะต้องลงทะเบียนเฉพาะเดมอนที่จะทำงานเท่านั้น และจะไม่เริ่มใช้งานจริงจนกว่าจะจำเป็น อันที่จริง แถบความคืบหน้าที่ปรากฏขึ้นระหว่างการบูตเป็นเพียงแอปพลิเคชันหลอก (ชื่อ WaitingForLoginWindow [ 1 ] ) ที่ไม่ได้แสดงอะไรนอกจากเวลาที่ผ่านไป
ส่วนที่จัดการยากที่สุดระหว่างการบูตด้วย launchd คือการจัดการการพึ่งพา (dependencies) SystemStarter มีระบบการพึ่งพาที่เรียบง่ายมาก โดยใช้คีย์ "Uses", "Requires" และ "Provides" ในไฟล์ plist ของรายการเริ่มต้น มีกลยุทธ์หลักสองอย่างในการสร้างการพึ่งพาของ launchd บน Tiger: IPCอนุญาตให้ daemon สื่อสารกันเองเพื่อจัดการการพึ่งพา หรือ daemon สามารถตรวจสอบไฟล์หรือพาธเพื่อหาการเปลี่ยนแปลง การใช้ IPC นั้นซับซ้อนกว่าคีย์ของ SystemStarter มาก และต้องใช้ความพยายามจากนักพัฒนามากขึ้น แต่ก็อาจนำไปสู่การเริ่มต้นระบบที่สะอาดและรวดเร็วยิ่งขึ้น SystemStarter ยังคงได้รับการสนับสนุนจนถึงOS X Mountain Lionแต่ถูกลบออกในOS X Yosemite
launchctl
ใน launchd การควบคุมบริการต่างๆ จะรวมศูนย์อยู่ที่launchctlแอปพลิเคชัน
เดิมที launchctl สามารถรับคำสั่งจากบรรทัดคำสั่ง จากอินพุตมาตรฐาน หรือทำงานในโหมดโต้ตอบได้ ด้วย สิทธิ์ ผู้ใช้ระดับสูงสุดผู้ใช้สามารถทำการเปลี่ยนแปลงทั่วทั้งระบบได้ และคำสั่งต่างๆ สามารถทำให้ถาวรได้เมื่อจัดเก็บไว้ใน/etc/launchd.conf ( ดูเหมือนว่าจะมีการพิจารณาไฟล์~/.launchd.confสำหรับผู้ใช้แต่ละราย[ 2 ]แต่ไม่เคยถูกนำไปใช้)
ใน macOS เวอร์ชันต่อมา โหมดโต้ตอบถูกลบออกไป เช่นเดียวกับความสามารถในการอ่านคำสั่งจากอินพุตมาตรฐาน และ ไฟล์ /etc/launchd.confก็ไม่ได้รับการสนับสนุนอีกต่อไป เหตุผลที่ให้ไว้สำหรับการเปลี่ยนแปลงเหล่านี้คือการพิจารณาด้านความปลอดภัย[ 3 ]
ปัจจุบัน launchctl ทำงานผ่านการเรียกใช้งานทางบรรทัดคำสั่งเท่านั้น และการคงสถานะการทำงานจะทำได้ผ่านไฟล์ launchd .plistที่อยู่ในตำแหน่งที่เหมาะสม (ดูด้านล่าง)
launchctl สื่อสารกับ launchd ผ่านกลไก IPC เฉพาะของ Mach
รายการอสังหาริมทรัพย์
ไฟล์รายการคุณสมบัติ (plist) เป็นไฟล์ประเภทหนึ่งที่ launchd ใช้สำหรับการกำหนดค่าโปรแกรม เมื่อ launchd สแกนโฟลเดอร์ หรือเมื่อมีการส่งงานผ่าน launchctl มันจะอ่านไฟล์ plist ที่อธิบายวิธีการทำงานของโปรแกรม
รายชื่อปุ่มที่ใช้บ่อยมีดังต่อไปนี้ ปุ่มทั้งหมดเป็นตัวเลือก เว้นแต่จะระบุไว้เป็นอย่างอื่น สำหรับรายชื่อทั้งหมด โปรดดูหน้าคู่มือของ Apple launchd.plistสำหรับ[ 4 ]
| สำคัญ | พิมพ์ | คำอธิบาย |
|---|---|---|
Label | สตริง | ชื่อของงาน ตามธรรมเนียมแล้ว ชื่อของงานจะเหมือนกับชื่อไฟล์ plist โดยไม่ต้องมีนามสกุล . plist จำเป็นต้องระบุ |
Program | สตริง | เส้นทางไปยังไฟล์ปฏิบัติการ มีประโยชน์สำหรับการเรียกใช้งานแบบง่ายๆ ต้องมีอย่างน้อยหนึ่ง อย่างจากProgramหรือProgramArguments |
ProgramArguments | อาร์เรย์ของสตริง | อาร์เรย์ของสตริงที่แสดงถึงคำสั่ง UNIX โดยทั่วไปสตริงแรกจะเป็นเส้นทางไปยังไฟล์ปฏิบัติการ ในขณะที่สตริงถัดไปจะมีตัวเลือกหรือพารามิเตอร์ ต้องมีอย่างน้อยหนึ่งตัวเลือกProgramหรือพารามิเตอร์ ProgramArguments |
UserName | สตริง(ค่าเริ่มต้นคือrootหรือผู้ใช้ปัจจุบัน) | งานดังกล่าวจะถูกเรียกใช้งานโดยผู้ใช้ที่ระบุ ซึ่งอาจเป็น (หรืออาจไม่ใช่) ผู้ใช้ที่ส่งงานไปยัง launchd |
OnDemand(เลิกใช้แล้วตั้งแต่เวอร์ชัน 10.5) | ค่าบูลีน(ค่าเริ่มต้นคือYES) | เลิกใช้แล้วในเวอร์ชัน 10.5 เนื่องจากมีKeepAliveตัวเลือก ที่ทรงพลังกว่า เป็นแฟล็ก แบบบูลีนที่กำหนดว่างานจะทำงานอย่างต่อเนื่องหรือไม่ |
RunAtLoad | ค่าบูลีน(ค่าเริ่มต้นคือNO) | ค่า บู ลีนที่กำหนดว่างานจะเริ่มทำงานทันทีหรือไม่เมื่อโหลดงานลงใน launchd |
StartOnMount | ค่าบูลีน(ค่าเริ่มต้นคือNO) | ค่า บู ลีนที่ใช้กำหนดว่าจะเริ่มทำงานหรือไม่เมื่อมีการติดตั้งระบบไฟล์ใหม่ |
QueueDirectories | อาร์เรย์ของสตริง | ตรวจสอบโฟลเดอร์เพื่อหาไฟล์ใหม่ โฟลเดอร์ต้องว่างเปล่าก่อน และต้องทำให้กลับสู่สถานะว่างเปล่าอีกครั้งก่อนQueueDirectoriesจึงจะเริ่มการทำงานได้ |
WatchPaths | อาร์เรย์ของสตริง | ตรวจสอบการเปลี่ยนแปลงในเส้นทางไฟล์ระบบ อาจเป็นไฟล์หรือโฟลเดอร์ก็ได้ |
StartInterval | จำนวนเต็ม | ตั้งค่าให้งานทำงานซ้ำตามกำหนดเวลา ระบุจำนวนวินาทีที่จะรอระหว่างการทำงานแต่ละครั้ง |
StartCalendarInterval | พจนานุกรมของจำนวนเต็มหรืออาร์เรย์ของพจนานุกรมของจำนวนเต็ม | การตั้งเวลาการทำงานของโปรแกรมรูป แบบการใช้งานคล้ายกับcron |
RootDirectory | สตริง | โปรแกรมจะถูกจำกัดการเข้าถึงไปยังไดเร็กทอรีนี้ก่อนที่จะเริ่มทำงาน |
WorkingDirectory | สตริง | ไฟล์งานจะถูกสร้างเป็นไดเร็กทอรีนี้ก่อนที่จะถูกเรียกใช้งาน |
| สตริง | ปุ่มต่างๆ สำหรับกำหนดไฟล์อินพุตและเอาต์พุตสำหรับกระบวนการที่เริ่มต้นขึ้น |
LowPriorityIO | บูลีน | แจ้งให้เคอร์เนลทราบว่างานนี้มีลำดับความสำคัญต่ำเมื่อทำการอ่านเขียนข้อมูลในระบบไฟล์ |
AbandonProcessGroup | ค่าบูลีน(ค่าเริ่มต้นคือNO) | ค่า บู ลีนที่กำหนดว่ากระบวนการย่อยที่เริ่มต้นจากงานที่เรียกใช้โดย launchd จะถูกยุติเมื่องานนั้นสิ้นสุดลงหรือไม่ มีประโยชน์ในกรณีที่งานที่มีอายุสั้นเริ่มต้นงานย่อยที่มีอายุยาว แต่Hอาจส่งผลให้เกิดกระบวนการซอมบี้ได้ |
SessionCreate | ค่าบูลีน(ค่าเริ่มต้นคือNO) | ค่า บู ลีนที่ใช้กำหนดว่าจะสร้างเซสชันความปลอดภัยสำหรับงานและกระบวนการย่อยหรือไม่ |
โปรโตคอลการเปิดใช้งานซ็อกเก็ต
ชื่อของแต่ละคีย์ภายใต้ Sockets จะถูกใส่ลงในสภาพแวดล้อมของงานเมื่อมีการรัน และตัวอธิบายไฟล์ของซ็อกเก็ตนั้นจะพร้อมใช้งานในตัวแปรสภาพแวดล้อมนั้น ซึ่งแตกต่างจากการเปิดใช้งานซ็อกเก็ตของ systemd ตรงที่ชื่อของคำจำกัดความซ็อกเก็ตภายในการกำหนดค่างานจะถูกเขียนโค้ดไว้ในแอปพลิเคชัน โปรโตคอลนี้มีความยืดหยุ่นน้อยกว่า แม้ว่าจะไม่จำเป็นต้องให้ daemon เขียนโค้ดตัวอธิบายไฟล์เริ่มต้น (ณ ปี 2014 คือ 3) เหมือนกับ systemd ก็ตาม[ 5 ]
ประวัติศาสตร์
ซอฟต์แวร์นี้ได้รับการออกแบบและเขียนโปรแกรมโดย Dave Zarzycki ที่ Apple บริษัทวางแผนที่จะแทนที่ซอฟต์แวร์ต่อไปนี้ทั้งหมดใน ระบบปฏิบัติการ Mac OS Xซึ่งส่วนใหญ่ได้ถูกแทนที่ไปแล้วในการเปิดตัวMac OS X เวอร์ชัน 10.4 (Tiger):
ในปี พ.ศ. 2548 R. Tyler Croy ได้พอร์ต launchd ไปยังFreeBSDซึ่งเป็นส่วนหนึ่งของโครงการ Google Summer of Code ไม่สามารถรันเป็น PID 1 ได้ (รันเฉพาะเซสชันเริ่มต้นเท่านั้น) และไม่ได้ถูกใช้งานทั่วไปบนแพลตฟอร์มดังกล่าว[ 6 ]
ในปี 2549 การแจกจ่าย Ubuntu Linuxพิจารณาที่จะใช้ launchd แต่ตัวเลือกนี้ถูกปฏิเสธเนื่องจากซอร์สโค้ดอยู่ภายใต้สัญญาอนุญาตสาธารณะของ Appleซึ่งถูกอธิบายว่าเป็น "ปัญหาลิขสิทธิ์ที่หลีกเลี่ยงไม่ได้" [ 7 ] Ubuntu จึงพัฒนาและเปลี่ยนไปใช้เครื่องมือจัดการบริการของตนเองแทน นั่นคือ Upstart
ในเดือนสิงหาคม พ.ศ. 2549 Apple ได้อนุญาตให้ใช้ launchd ภายใต้Apache License เวอร์ชัน 2.0 อีกครั้งเพื่ออำนวยความสะดวกในการนำไปใช้โดยนักพัฒนาโอเพนซอร์สรายอื่น[ 8 ]ระบบปฏิบัติการ Linux ส่วนใหญ่ใช้systemdหรือUpstartหรือใช้init ต่อไป และระบบปฏิบัติการ BSDก็ยังคงใช้ init ต่อไปเช่นกัน
ในเดือนธันวาคม พ.ศ. 2556 R. Tyler Croy ประกาศความตั้งใจที่จะกลับมาทำงานต่อในพอร์ต launchd ของเขาไปยัง FreeBSD และหลังจากนั้นคลังเก็บ GitHub "openlaunchd" ของเขาก็มีกิจกรรมเพิ่มขึ้น[ 9 ]
การจับภาพ Wayback Machine ครั้งสุดท้ายของพื้นที่ Mac OS Forge สำหรับ launchd เกิดขึ้นในเดือนมิถุนายน 2012 [ 10 ]และเวอร์ชันโอเพนซอร์สล่าสุดจาก Apple คือ842.92.1ในโค้ดสำหรับ OS X 10.9.5
ในปี 2557 Apple ได้ย้ายโค้ดสำหรับ launchd ไปยัง libxpc ซึ่งเป็นซอร์สโค้ดแบบปิดใน OS X 10.10 และ iOS 8 [ 11 ]
ในเดือนสิงหาคม 2015 จอร์แดน ฮับบาร์ด และ คิป เมซี ได้ประกาศเปิด ตัว NextBSDซึ่งใช้เคอร์เนล FreeBSD-CURRENT เป็นพื้นฐาน พร้อมทั้งเพิ่ม Mach IPC, Libdispatch, notifyd, asld, launchd และส่วนประกอบอื่นๆ ที่ได้มาจาก Darwin ซึ่งเป็นโค้ดโอเพนซอร์สของ Apple สำหรับ OS X
ประวัติการเผยแพร่ซอฟต์แวร์โอเพนซอร์สของแอปเปิล
ดูเพิ่มเติม
- systemd : ยูทิลิตี้ที่คล้ายกันซึ่งพัฒนาโดยRed Hatสำหรับใช้ในระบบปฏิบัติการ Linux หลักต่างๆ
- สิ่งอำนวยความสะดวกในการจัดการบริการ
- ซูเปอร์เซิร์ฟเวอร์
- ตัวห่อ TCP
- การจัดการบริการระบบปฏิบัติการ
ลิงก์ภายนอก
นักพัฒนาของ Apple:
- คู่มือการเขียนโปรแกรมสำหรับ Mac Developer Library: Daemons และ Services: การสร้าง Launch Daemons และ Agents
- คลังข้อมูลสำหรับนักพัฒนา Mac: บันทึกทางเทคนิค TN2083: Daemon และ Agent
คลังเอกสารสำหรับนักพัฒนาของ Apple ที่เกษียณอายุแล้ว:
- : ตัวจัดการดีมอนระดับระบบและตัวจัดการเอเจนต์ต่อผู้ใช้ – คู่มือตัวจัดการระบบของDarwinและmacOS
- – คู่มือรูปแบบไฟล์สำหรับDarwinและmacOS
- – คู่มือรูปแบบไฟล์สำหรับDarwinและmacOS
- – คู่มือคำสั่งทั่วไปสำหรับDarwinและmacOS
ลิงก์อื่นๆ:
- คลังข้อมูลสำหรับนักพัฒนาของ Apple: เริ่มต้นใช้งาน launchdที่Wayback Machine (เก็บถาวรเมื่อวันที่ 4 กรกฎาคม 2550)
- Launchd: โปรแกรมเดียวครองโลก - YouTube – การนำเสนอโดย Dave Zarzycki อัปโหลดเมื่อวันที่ 8 ตุลาคม 2550 โดยGoogleTechTalks
- wiki.freebsd.org/launchd
- developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/