ป้ายกำกับ: Patches

MacOS: ตั้งเวลาทำงานใน mac โดย launchdMacOS: ตั้งเวลาทำงานใน mac โดย launchd

การตั้งเวลาทำงาน (Scheduled Tasks) เป็นฟังก์ชันพื้นฐานที่จำเป็นสำหรับระบบอัตโนมัติ ไม่ว่าจะเป็นการล้างแคช การซิงค์ข้อมูล หรือการอัปเดตฐานข้อมูลตามรอบเวลา อย่างไรก็ตาม สำหรับผู้ใช้งาน macOS การใช้เครื่องมือแบบดั้งเดิมอย่าง Cron อาจไม่ตอบโจทย์ความยืดหยุ่นและความน่าเชื่อถือในทุกสถานการณ์

ในฐานะ System Specialist เราขอแนะนำให้ใช้ launchd ซึ่งเป็นระบบจัดการงานพื้นหลัง (Daemon) ที่ Apple พัฒนาขึ้นมาโดยเฉพาะ launchd ถูกออกแบบมาให้ฉลาดกว่า Cron มาก เพราะมันไม่ได้แค่รันคำสั่งตามเวลา แต่ยังสามารถตอบสนองต่อเหตุการณ์ต่างๆ ของระบบได้ด้วย

🚀 launchd คืออะไร และทำไมจึงดีกว่า Cron?

launchd คือระบบที่ใช้ไฟล์คอนฟิกูเรชันที่เรียกว่า Property List (.plist) ในการกำหนดงานต่างๆ แทนที่จะใช้ไวยากรณ์แบบบรรทัดคำสั่งที่ตายตัวเหมือน Cron, launchd สามารถกำหนดเงื่อนไขการทำงานที่ซับซ้อนกว่ามาก เช่น:

  • Event-Driven: รันเมื่อมีการเสียบอุปกรณ์ USB, เมื่อมีการเปิด/ปิดเครื่อง, หรือเมื่อมีการแก้ไขไฟล์ที่กำหนด
  • Robustness: สามารถตั้งค่าให้งานรันได้แม้ว่าเครื่องจะอยู่ในสถานะ Sleep หรือมีการปิดเครื่องชั่วคราว
  • Scope: สามารถกำหนดขอบเขตการทำงานได้ชัดเจน ทั้งระดับ User (LaunchAgents) และระดับ System (LaunchDaemons)

⚙️ วิธีการตั้งเวลาทำงานด้วยไฟล์ .plist

การตั้งค่างานใน macOS ผ่าน launchd จะต้องสร้างไฟล์นามสกุล .plist และวางไว้ในตำแหน่งที่เหมาะสม โดยสำหรับงานที่ต้องการให้รันในระดับผู้ใช้งาน (User) จะต้องวางไฟล์ไว้ใน ~/Library/LaunchAgents/

สมมติว่าเราต้องการตั้งค่าให้รันสคริปต์ /Users/Shared/Gits/git-update-all.sh ทุกวันจันทร์ เวลา 9:00 น. เราจะต้องสร้างไฟล์ gitupdate.daily.plist โดยมีโครงสร้างดังนี้:

XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>gitupdate.daily</string>

    <key>ProgramArguments</key>
    <array>
        <string>/bin/zsh</string>
        <string>/Users/Shared/Gits/git-update-all.sh</string>
    </array>

    <key>StartCalendarInterval</key>
    <dict>
        <key>Weekday</key>
        <integer>1</integer>  <!-- 1 = วันจันทร์ -->
        <key>Hour</key>
        <integer>9</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>

    <key>StandardOutPath</key>
    <string>/tmp/git-update.log</string>
    <key>StandardErrorPath</key>
    <string>/tmp/git-update.err</string>
</dict>
</plist>

หลังจากบันทึกไฟล์แล้ว อย่าลืมโหลดงานให้ระบบรู้จักด้วยคำสั่ง launchctl load ~/Library/LaunchAgents/gitupdate.daily.plist

💡 ข้อดีเชิงสถาปัตยกรรม (Architectural Insight)

การใช้ launchd ไม่ได้จำกัดอยู่แค่การตั้งเวลาเท่านั้น แต่ยังเป็นแนวทางปฏิบัติที่ดีที่สุด (Best Practice) ในการจัดการงานพื้นหลังของ macOS เพราะมันช่วยให้โค้ดของเรามีความยืดหยุ่นสูง สามารถเปลี่ยนไปใช้ Trigger อื่นๆ ได้ง่าย เช่น การรันเมื่อมีไฟล์ใหม่ถูกสร้างขึ้น (File Monitoring) ซึ่งเป็นสิ่งที่ Cron ทำไม่ได้

✅ บทสรุป

สำหรับนักพัฒนาและผู้ดูแลระบบที่ต้องการความเสถียรและความสามารถในการตอบสนองต่อเหตุการณ์ต่างๆ การใช้ launchd คือคำตอบที่เหนือกว่าการใช้ Cron อย่างชัดเจน การทำความเข้าใจโครงสร้างของไฟล์ .plist จะช่วยให้คุณสามารถสร้างระบบอัตโนมัติที่ทรงพลังและเชื่อถือได้บนแพลตฟอร์ม macOS ได้อย่างสมบูรณ์