Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Mac

วิธีใช้ launchd รันสคริปต์ตามตารางเวลาใน macOS

launchd เป็นเครื่องมือสำหรับเริ่ม หยุด และจัดการสคริปต์และกระบวนการ หากคุณเคยทำงานกับ Linux ใดๆ คุณอาจคุ้นเคยกับ cron launchd คือ cron ของ macOS ในแง่พื้นฐาน

Daemons คืออะไร?

วิธีใช้ launchd รันสคริปต์ตามตารางเวลาใน macOS

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

ชื่อที่แปลกประหลาดมาจาก Maxwell's demon ตัวแทนจินตนาการที่จัดเรียงโมเลกุลในทดลองความคิดทางเทอร์โมไดนามิกส์

การเขียนสคริปต์

วิธีใช้ launchd รันสคริปต์ตามตารางเวลาใน macOSวิธีใช้ launchd รันสคริปต์ตามตารางเวลาใน macOS

เพื่อรัน daemons ผ่าน launchd คุณจะต้องเขียนสคริปต์บางอย่าง ภาษาสคริปติ้งที่พบบ่อยที่สุดคือ bash หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการเขียนสคริปต์ bash คุณสามารถดูคู่มือผู้เริ่มต้นสำหรับการเขียนสคริปต์ bash ของเราได้

การใช้ launchd

วิธีใช้ launchd รันสคริปต์ตามตารางเวลาใน macOS

สคริปต์ใน 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

วิธีใช้ launchd รันสคริปต์ตามตารางเวลาใน macOS

เมื่อคุณสร้างสคริปต์และบันทึก agent ของคุณในที่ที่ถูกต้องแล้ว คุณจะต้องโหลดมันเข้า launchctl นี่จะเกิดขึ้นอัตโนมัติเมื่อล็อกอินในอนาคต

เพื่อดูว่ามีอะไรทำงานอยู่ใน launchctl ปัจจุบัน คุณสามารถใช้ launchctl list ในเทอร์มินัล รายการใหญ่นี้สามารถ grep สำหรับสคริปต์ของคุณได้โดยการติดฉลากมันด้วยสิ่งอย่างเช่น:

launchctl list | grep local.restart

เพื่อโหลดสคริปต์ ให้เปิด Terminal และใช้คำสั่งต่อไปนี้:

launchctl load ~/Library/LaunchAgents/local.restart.plist
วิธีใช้ launchd รันสคริปต์ตามตารางเวลาใน macOS

เพื่อนำสคริปต์ออกจากคิว launchctl ให้ใช้คำสั่ง unload:

launchctl unload ~/Library/LaunchAgents/local.restart.plist
วิธีใช้ launchd รันสคริปต์ตามตารางเวลาใน macOS

การโหลดงานวางมันในคิว launchd และงานจะรันในเวลาที่ระบุในเงื่อนไขการเปิดใช้งานของมัน หากคุณต้องการรันสคริปต์ทันทีไม่ว่าใด คุณควรใช้คำสั่ง "start":

launchctl start local.restart

คำสั่งนี้รับ label ของงาน และจะทำงานก็ต่อเมื่องานถูกโหลดเข้า launchctl แล้ว

สรุป

คุณสามารถใช้ launchd สร้างสคริปต์ที่ทำอย่างเช่น ทำความสะอาดไฟล์ รีสตาร์ทเซิร์ฟเวอร์ตามตารางเวลา หรือรันแอปพลิเคชันเมื่อไฟล์เฉพาะปรากฏ เพื่อเรียนรู้เพิ่มเติมมากเกี่ยวกับ launchd คุณสามารถดู tutorial ของ launchd ได้