launchd เป็นเครื่องมือสำหรับการเริ่ม หยุด และจัดการสคริปต์และกระบวนการ หากคุณเคยทำงานกับ Linux เวอร์ชันใดก็ตาม คุณอาจคุ้นเคยกับ cron launchd นั้นเป็น cron ใน macOS
ภูตคืออะไร
Daemons (ออกเสียงว่า “ปีศาจ”) เป็นสคริปต์ที่ทำงานอยู่เบื้องหลัง ไม่เหมือนกับแอปพลิเคชัน daemons ทำงานเป็นกระบวนการและไม่ได้อยู่ภายใต้การควบคุมโดยตรงของผู้ใช้หรือแอปพลิเคชันอื่น ใน macOS จะอยู่ภายใต้คำสั่งของกรอบงาน launchd ซึ่งจะกำหนดว่าเมื่อใดที่จะเริ่มและหยุด
ชื่อที่ผิดปกตินี้มาจากอสูรของ Maxwell ซึ่งเป็นตัวแทนในจินตนาการที่จัดเรียงโมเลกุลในการทดลองทางความคิดทางอุณหพลศาสตร์
การเขียนสคริปต์
ในการรัน daemons ผ่าน launchd คุณจะต้องเขียนสคริปต์ ภาษาสคริปต์ที่พบบ่อยที่สุดคือ bash หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการเขียนสคริปต์ทุบตี คุณสามารถดูคู่มือการเริ่มต้นใช้งานสคริปต์ทุบตีของเราได้
ใช้ launchd
สคริปต์ใน launchd ถูกทริกเกอร์โดยข้อกำหนดของงาน ซึ่งเป็นไฟล์ .plist ที่จัดเก็บไว้ในไดเรกทอรีเฉพาะ ไฟล์ XML เหล่านี้ให้ชื่องาน ระบุสคริปต์ที่ควรเปิดใช้ และระบุว่าควรเรียกใช้สคริปต์เมื่อใด เมื่อคุณเขียนสคริปต์แล้ว คุณจะต้องเขียนและโหลดข้อกำหนดงานที่เรียกใช้สคริปต์ในเวลาที่เหมาะสม
คำจำกัดความของงานจะมีลักษณะดังนี้:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>local.restart</string> <key>Program</key> <string>/Users/user/Scripts/restart.sh</string> <key>RunAtLoad</key> <true/> </dict> </plist>
แก้ไขตามความจำเป็น จากนั้นใส่ลงในไฟล์ข้อความที่มีนามสกุล .plist ก่อนวางลงในไดเร็กทอรีที่ถูกต้อง (ดูด้านล่าง)
มีส่วนสำคัญสองสามส่วนในรายละเอียดงาน:
- ป้ายกำกับ: ชื่องานภายใน Launchd ต้องไม่ซ้ำกันสำหรับแต่ละงาน สิ่งเหล่านี้เขียนด้วยสัญลักษณ์โดเมนย้อนกลับ และ “ท้องถิ่น” เป็นโดเมนที่ยอดเยี่ยมสำหรับตัวแทนส่วนตัว
- โปรแกรม: เส้นทางแบบเต็มของสคริปต์คำอธิบายงานนี้จะเปิดขึ้น
- RunAtLoad: อธิบายว่าสคริปต์ควรรันเมื่อใด มีตัวเลือกต่างๆ ดังต่อไปนี้
- RunAtLoad :รันทันทีที่โหลดข้อกำหนดของงาน เรียกใช้เพียงครั้งเดียวต่อการโหลด
- ช่วงเริ่มต้น :เริ่มงานทุก n วินาที ตัวอย่างนี้จะรันงานทุกๆ 7200 วินาทีหรือทุกๆ 2 ชั่วโมง
<key>StartInterval</key> <integer>7200</integer>
- StartCalendarInterval :เรียกใช้งานในเวลาและวันที่ที่กำหนด รหัสด้านล่างจะทำงานทุกวันเวลา 9.00 น.
<key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>9</integer> <key>Minute</key> <integer>0</integer> </dict>
เอเจนต์ vs. daemons
เมื่อคุณเขียนรายละเอียดงานแล้ว คุณจะต้องบันทึกไว้ในไดเร็กทอรีที่เหมาะสม
launchd แยกความแตกต่างระหว่างเอเจนต์และ daemons เพิ่มเติม เอเจนต์รันในนามของผู้ใช้ที่ล็อกอิน ในขณะที่ daemon รันภายใต้ผู้ใช้รูท ซึ่งหมายความว่าหากคุณต้องการจำกัดสคริปต์สำหรับบัญชีผู้ใช้เฉพาะ คุณสามารถใช้ตัวแทนได้ หากคุณต้องการให้บางสิ่งทำงานไม่ว่าใครจะเข้าสู่ระบบ คุณจะใช้ภูต
ความแตกต่างระหว่างตัวแทนและภูตถูกดึงมาจากตำแหน่งที่บันทึกไว้ในคอมพิวเตอร์:
- “~/Library/LaunchAgents” ทำงานในนามของผู้ใช้ที่เข้าสู่ระบบ
- “/Library/LaunchDaemons” ทำงานในนามของผู้ใช้รูท
คุณจะต้องบันทึก plist ของคุณในตำแหน่งที่ถูกต้อง
กำลังโหลดงานเข้าสู่ launchctl
เมื่อคุณสร้างสคริปต์และบันทึกตัวแทนของคุณไว้ในที่ที่ถูกต้องแล้ว คุณจะต้องโหลดสคริปต์ลงใน launchctl
. สิ่งนี้จะเกิดขึ้นโดยอัตโนมัติเมื่อเข้าสู่ระบบในอนาคต
หากต้องการดูสิ่งที่กำลังทำงานอยู่ใน laucnhctl คุณสามารถใช้ launchctl list
ในเทอร์มินัล รายการยักษ์นี้สามารถ grpped สำหรับสคริปต์ของคุณโดยติดป้ายกำกับด้วยสิ่งต่อไปนี้:
launchctl list | grep local.restart
ในการโหลดสคริปต์ ให้เปิด Terminal และใช้คำสั่งต่อไปนี้:
launchctl load ~/Library/LaunchAgents/local.restart.plist
หากต้องการลบสคริปต์ออกจากคิว launchctl ให้ใช้ unload
คำสั่ง:
launchctl unload ~/Library/LaunchAgents/local.restart.plist
การโหลดงานจะทำให้งานนั้นอยู่ในคิวการเรียกใช้งาน และงานจะรันตามเวลาที่ระบุในเงื่อนไขการเรียกใช้งาน หากคุณต้องการเรียกใช้สคริปต์ทันทีไม่ว่าจะเกิดอะไรขึ้น คุณควรใช้คำสั่ง “start”:
launchctl start local.restart
คำสั่งนี้ใช้ป้ายกำกับของงานและจะทำงานก็ต่อเมื่อโหลดงานลงใน launchctl
แล้ว .
บทสรุป
คุณสามารถใช้ launchd เพื่อสร้างสคริปต์ที่ทำสิ่งต่างๆ เช่น ล้างไฟล์ รีสตาร์ทเซิร์ฟเวอร์ตามกำหนดเวลา หรือเรียกใช้แอปพลิเคชันเมื่อมีไฟล์บางไฟล์ปรากฏขึ้น หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ launchd คุณสามารถดูบทแนะนำ laucnhd