ทุกคนสามารถแนะนำกวดวิชาที่ดีสำหรับการเขียน (ตั้งแต่ต้น) งานเปิดตัวสไตล์ cron?


19

ฉันมีงานง่าย ๆ ที่ฉันอยากวิ่งทุกชั่วโมง ฉันสามารถใช้มันได้cronแต่ฉันคิดว่าฉันจะใช้สิ่งนี้เพื่อเรียนรู้launchdเนื่องจากฉันได้ยินสิ่งดีๆเกี่ยวกับมัน ฉันได้รับman launchd.plistหน้าเป็นข้อมูลอ้างอิง แต่ฉันกำลังมองหาบางสิ่งที่เพิ่มเติมจากการสร้างงานตัวอย่าง


สิ่งนี้ควรถูกย้ายไปที่ Stackoverflow
Philip Regan

5
@ ฟิลิปรีแกนฉันคิดเกี่ยวกับมัน แต่ไม่มีการเขียนโปรแกรมที่เกี่ยวข้องจริงๆสำหรับฉัน หากฉันถูกถามcronคำถาม superuser.com จะไม่ใช่สถานที่ใช่ไหม เนื่องจากlaunchdเป็นเวอร์ชั่นของ Apple cron(และรวมdaemontoolsถึงและสิ่งอื่น ๆ ) ฉันคิดว่านี่เป็นตัวเลือกที่ดีที่สุดของฉัน
แฮงค์เกย์

คุณสามารถวางไว้ในสคริปต์อัตโนมัติและเรียกใช้จาก iCal - ถ้ามันทำงานเหมือนคุณ
user151019

ในการประชดตลกสามปีต่อมาฉันต้องใช้กระบวนการ cron / launchd ด้วยตัวเองและพบว่าตัวเองกำลังดูคำถามนี้อีกครั้งในแง่ที่แตกต่างอย่างสิ้นเชิง Stack Overflow มีความคิดเห็นที่หลากหลายเกี่ยวกับคำถามเปิดตัว แต่พวกเขาไม่ชอบคำถามเหล่านี้ แค่คิดว่าสถานการณ์ทั้งหมดน่าขบขัน +1
Philip Regan

คำตอบ:


14

launchdรัน Daemons ( /Library/LaunchDaemonsหรือ/System/Library/LaunchDaemons) เป็นรูทและจะรันโดยไม่คำนึงว่าผู้ใช้ล็อกอินหรือไม่ เรียกตัวแทน ( /Library/LaunchAgents/หรือ~/Library/LaunchAgents/) จะทำงานเมื่อผู้ใช้เข้าสู่ระบบในฐานะผู้ใช้นั้น คุณไม่สามารถใช้ setuid เพื่อเปลี่ยนผู้ใช้ที่รันสคริปต์บน daemons /Systemไดเรกทอรีที่สงวนไว้สำหรับงาน Mac OS X ดังนั้นผมขอแนะนำให้คุณวางlaunchdplists เข้าไปอย่างใดอย่างหนึ่ง/Libraryหรือ~/Libraryโฟลเดอร์ที่มันทำให้รู้สึก

ดังนั้นขั้นตอนแรกคือการพิจารณาว่าคุณกำลังสร้างตัวแทนหรือภูต

ขั้นตอนที่สองคือการสร้าง.plistไฟล์ของคุณ คุณสามารถใช้โปรแกรมที่ใช้ GUI เช่นLingonเพื่อช่วยในเรื่องนี้หรือเพียงแค่ใช้โปรแกรมแก้ไขข้อความที่คุณชื่นชอบ:

ตัวอย่าง.plistสำหรับการเรียกใช้สคริปต์ทุก ๆ ชั่วโมง ( StartIntervalหรือStartIntervalCalendarเป็นกุญแจที่เราต้องการ - StartIntervalเพื่อให้รายการเกิดขึ้นทุกxวินาทีStartIntervalCalendarในเวลาและ / หรือวันที่เฉพาะเจาะจงดู126907 ใน SuperUserสำหรับตัวอย่างที่ฉันทำด้วย StartCalendarInterval):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>OnDemand</key>
    <true/>
    <key>RunAtLoad</key>
    <false/>
    <key>UserName</key>
    <string>USERNAME HERE</string>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>ProgramArguments</key>
    <array>
        <string>Argument_1</string>
        <string>Argument_2</string>
    </array>
    <key>StartInterval</key>
    <integer>3600</integer>
</dict>
</plist>

ปรับเปลี่ยนที่.plistจำเป็นเพื่อชี้ไปที่สคริปต์ของคุณและข้อโต้แย้งใด ๆ ตามความจำเป็น (ข้อโต้แย้งอยู่ในบรรทัดที่แยกต่างหาก) และบันทึกไฟล์ที่มีชื่อเดียวกันกับค่าป้ายกำกับ แต่ด้วย.plistในตอนท้าย (ตัวอย่างเช่นlocal.my-mac.flickrstatsจะถูกบันทึกเป็นlocal.my-mac.flickrstats.plist) หากคุณยังไม่ได้ย้าย.plistไฟล์ไปที่/Library/LaunchDaemonsเมื่อสร้าง Daemon (ทำงานตลอดเวลา) หรือไปที่~/Library/LaunchAgents(เฉพาะคุณเข้าสู่ระบบ) หรือ/Library/LaunchAgents(ผู้ใช้ใด ๆ ที่เข้าสู่ระบบ)

ในการเริ่มงานที่คุณต้องการเรียกใช้launchctlตามความจำเป็นเพื่อโหลดไฟล์ สำหรับรายการใน/Libraryคุณควรใช้ sudo: ตัวอย่างเช่นsudo launchctl load -w /PATH/TO/PLIST

สำหรับการอ้างอิงตรวจสอบคำถามต่อไปนี้เกี่ยวกับ Super User: คำสั่ง Launchd ในฐานะ root , โหลด daemon ของระบบและฉันจะรับสคริปต์ให้ทำงานทุกวันได้อย่างไร


4

ฉันรู้ว่ามันไม่ใช่แบบฝึกหัดที่ดีแต่คุณสามารถดูคู่มือการเขียนโปรแกรม Daemons และบริการจาก Apple ซึ่งมีส่วนเกี่ยวกับ Scheduling Timed Jobs

ฉันรู้ว่ามันไม่ได้เป็นกวดวิชาเต็ม launchdแต่กับมันคุณสามารถเข้าใจพื้นฐานของ

นอกจากนี้ยังมีตัวอย่างของcrondงาน:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.
com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>  
    <key>Label</key>
    <string>com.apple.periodic-daily</string>
    <key>ProgramArguments</key>
    <array> 
        <string>/usr/sbin/periodic</string>
        <string>daily</string>
    </array>
    <key>LowPriorityIO</key>
    <true/>
    <key>Nice</key>
    <integer>1</integer>
    <key>StartCalendarInterval</key>
    <dict>  
        <key>Hour</key>
        <integer>3</integer>
        <key>Minute</key>
        <integer>15</integer>
    </dict>
</dict>
</plist>

ฉันลงคะแนนเพราะคุณยอมรับว่าทรัพยากรไม่ใช่สิ่งที่ฉันขอและมันทำให้ฉันเป็น RTFM เล็กน้อย แต่ฉันคิดใหม่แล้วและฉันต้องการยกเลิก downvote ของฉัน น่าเสียดายที่ฉันทำไม่ได้หากไม่มีการแก้ไขคำถาม (ยาวเกินไป) และฉันยังมีตัวแทนไม่เพียงพอที่จะแก้ไข คุณสามารถปรับแต่งบางอย่างได้ไหม ขอบคุณ
แฮงค์เกย์

@Hank Gay: ขอบคุณสำหรับความคิดเห็นของคุณ ฉันแก้ไขคำตอบของฉันด้วย
Studer

4

สิ่งนี้ช่วยฉันได้มาก: http://launchd.info

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


2

ฉันรู้ว่าคุณกำลังมองหาการสอน แต่เมื่อมีคนมาที่นี่เป็นส่วนหนึ่งของการมองหาเครื่องมือที่จะช่วยให้พวกเขาสร้าง / แก้ไขรายการ launchd ฉันได้ใช้สิ่งนี้มาก่อน: Lingon (sourceforge)

มันไม่ได้ถูกพัฒนาอย่างแข็งขันอีกต่อไป แต่สิ่งที่ใช้งานได้ (และรวมถึงแหล่งที่มา ฯลฯ ) ฉันใช้มันใน Snow Leopard เพื่อกำหนดเวลาการสำรองข้อมูลไปยังเมฆ Amazon เป็นต้น


Lingon อยู่ใน App Store ดังนั้นจึงยังคงใช้งานได้ฟรีไม่ต้องดู < peterborgapps.com/lingon >
user151019

เวอร์ชันของ appstore นั้นพิการตามข้อกำหนดนโยบายของ Apple ซอร์สโค้ดที่รวบรวมไว้ล่วงหน้าทำงานได้ดี - แม้ว่ากล่องโต้ตอบโมดอลจะบันทึกช่วยให้ฉันออกจากระบบหรือรีสตาร์ทเพื่อเปิดใช้งาน daemon จะไม่ยกเลิก ฉันต้องออกจากโปรแกรมจากเมนูมัน (ไม่บังคับออกจาก) และตรวจสอบเพื่อยืนยันว่ามันได้บันทึกไฟล์อย่างถูกต้อง ไม่สนับสนุนการเรียกใช้ไฟล์และทริกเกอร์ไดเรกทอรีในและไม่สามารถสร้างสิ่งที่ทำงานเหมือนรูทด้วยเวอร์ชัน AppStore
marfarma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.