launchd เป็นเครื่องมือสำหรับเริ่ม หยุด และจัดการสคริปต์และกระบวนการ หากคุณเคยทำงานกับ Linux ใดๆ คุณอาจคุ้นเคยกับ cron launchd คือ cron ของ macOS ในแง่พื้นฐาน
Daemons คืออะไร?
Daemons (อ่านว่า "ดีมอนส์") คือสคริปต์ที่รันในพื้นหลัง ไม่เหมือนแอปพลิเคชัน daemons รันเป็นกระบวนการและไม่อยู่ภายใต้การควบคุมโดยตรงของผู้ใช้หรือแอปพลิเคชันอื่น บน macOS พวกเขาอยู่ภายใต้คำสั่งของกรอบงาน launchd ซึ่งตัดสินใจเมื่อพวกเขาเริ่มและหยุด
ชื่อที่แปลกประหลาดมาจาก Maxwell's demon ตัวแทนจินตนาการที่จัดเรียงโมเลกุลในทดลองความคิดทางเทอร์โมไดนามิกส์
การเขียนสคริปต์

เพื่อรัน daemons ผ่าน launchd คุณจะต้องเขียนสคริปต์บางอย่าง ภาษาสคริปติ้งที่พบบ่อยที่สุดคือ bash หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการเขียนสคริปต์ bash คุณสามารถดูคู่มือผู้เริ่มต้นสำหรับการเขียนสคริปต์ bash ของเราได้
การใช้ launchd
สคริปต์ใน launchd ถูกทริกเกอร์โดยการกำหนดงาน (job definitions) ซึ่งเป็นไฟล์ .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 ก่อนวางในไดเรกทอรีที่ถูกต้อง (ดูด้านล่าง)
มีส่วนสำคัญบางส่วนในคำอธิบายงาน:
- Label: ชื่อของงานภายใน launchd ต้องเป็นเอกลักษณ์สำหรับแต่ละงาน เขียนในรูปแบบ reverse domain notation และ "local" เป็นโดเมนที่ดีสำหรับเอเจนต์ส่วนตัว
- Program: เส้นทางเต็มของสคริปต์ที่คำอธิบายงานนี้เปิดใช้
- RunAtLoad: อธิบายเมื่อใดสคริปต์ควรรัน มีตัวเลือกไม่กี่อย่าง:
- RunAtLoad: รันทันทีที่โหลดการกำหนดงาน รันเพียงครั้งเดียวต่อการโหลด
- StartInterval: เริ่มงานทุก n วินาที ตัวอย่างนี้จะรันทุก 7200 วินาที หรือทุก 2 ชั่วโมง
<key>StartInterval</key> <integer>7200</integer>
- StartCalendarInterval: รันงานในเวลาและวันที่เฉพาะ โค้ดด้านล่างจะรันทุกวันเวลา 9 โมงเช้า
<key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>9</integer> <key>Minute</key> <integer>0</integer> </dict>
Agents ต่อ Daemons
เมื่อคุณเขียนคำอธิบายงานเสร็จ คุณจะต้องบันทึกมันในไดเรกทอรีที่เหมาะสม
launchd แยกความแตกต่างระหว่าง agents และ daemons อีก Agent รันในนามของผู้ใช้ที่ล็อกอินอยู่ ในขณะที่ daemon รันภายใต้ผู้ใช้ root นี่หมายความว่าหากคุณต้องการจำกัดสคริปต์ให้บัญชีผู้ใช้เฉพาะ คุณสามารถใช้ agent หากคุณต้องการให้บางอย่างรันไม่ว่าใครจะล็อกอินอยู่ คุณจะใช้ daemon
ความแตกต่างระหว่าง agents และ daemons มาจากที่พวกเขาบันทึกบนคอมพิวเตอร์:
- "~/Library/LaunchAgents" รันในนามของผู้ใช้ที่ล็อกอินอยู่
- "/Library/LaunchDaemons" รันในนามของผู้ใช้ root
คุณจะต้องบันทึก plist ของคุณในตำแหน่งที่ถูกต้อง
การโหลดงานเข้า launchctl
เมื่อคุณสร้างสคริปต์และบันทึก agent ของคุณในที่ที่ถูกต้องแล้ว คุณจะต้องโหลดมันเข้า launchctl นี่จะเกิดขึ้นอัตโนมัติเมื่อล็อกอินในอนาคต
เพื่อดูว่ามีอะไรทำงานอยู่ใน launchctl ปัจจุบัน คุณสามารถใช้ launchctl list ในเทอร์มินัล รายการใหญ่นี้สามารถ grep สำหรับสคริปต์ของคุณได้โดยการติดฉลากมันด้วยสิ่งอย่างเช่น:
launchctl list | grep local.restart
เพื่อโหลดสคริปต์ ให้เปิด Terminal และใช้คำสั่งต่อไปนี้:
launchctl load ~/Library/LaunchAgents/local.restart.plist
เพื่อนำสคริปต์ออกจากคิว launchctl ให้ใช้คำสั่ง unload:
launchctl unload ~/Library/LaunchAgents/local.restart.plist
การโหลดงานวางมันในคิว launchd และงานจะรันในเวลาที่ระบุในเงื่อนไขการเปิดใช้งานของมัน หากคุณต้องการรันสคริปต์ทันทีไม่ว่าใด คุณควรใช้คำสั่ง "start":
launchctl start local.restart
คำสั่งนี้รับ label ของงาน และจะทำงานก็ต่อเมื่องานถูกโหลดเข้า launchctl แล้ว
สรุป
คุณสามารถใช้ launchd สร้างสคริปต์ที่ทำอย่างเช่น ทำความสะอาดไฟล์ รีสตาร์ทเซิร์ฟเวอร์ตามตารางเวลา หรือรันแอปพลิเคชันเมื่อไฟล์เฉพาะปรากฏ เพื่อเรียนรู้เพิ่มเติมมากเกี่ยวกับ launchd คุณสามารถดู tutorial ของ launchd ได้