วิธีการลงทะเบียนตัวแทนด้วย launchd


14

ฉันไม่สามารถกำหนดเวลาเปิดตัวเป็นครั้งคราวด้วยlaunchctl/ launchdบน OS X (Leopard) โดยทั่วไปฉันไม่สามารถหารายการคำแนะนำทีละขั้นตอนบนเว็บและวิธีการที่ใช้งานง่ายไม่ทำงาน

sync.plistไฟล์:

<?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>net.madrat.utils.sync</string>
        <key>Program</key>
        <string>rsync</string>
        <key>ProgramArguments</key>
        <array>
            <string>-ar</string>
            <string>/path/to/folder/</string>
            <string>/path/to/backup/</string>
        </array>
        <key>StartInterval</key>
        <integer>7200</integer>
    </dict>
</plist>

~/Library/LaunchAgentsฉันได้ใส่สคริปต์นี้ภายในเส้นทาง

ต่อไปฉันลงทะเบียนสคริปต์โดยใช้

launchctl load ~/Library/LaunchAgents/sync.plist

ในที่สุดเพื่อทดสอบว่ามันใช้งานได้ฉันเริ่มงาน:

 launchctl start net.madrat.utils.sync

- ไม่มีอะไรเกิดขึ้น. การดำเนินการrsyncคำสั่งด้วยตนเองในเทอร์มินัลจะทำให้ได้ผลลัพธ์ที่คาดหวัง

ฉันค่อนข้างแน่ใจว่างานได้รับการลงทะเบียนอย่างถูกต้องเพราะถ้าฉันพยายามเริ่มงานที่ไม่มีอยู่ฉันได้รับข้อความแสดงข้อผิดพลาด (ซึ่งฉันไม่ได้รับคำสั่งด้านบน)

ผมทำอะไรผิด?

คำตอบ:


5

Lingonเป็นเครื่องมือ GUI ที่ดีในการจัดการ launchd ดูเหมือนว่าโครงการนี้จะไม่ได้รับการสนับสนุนในขณะนี้ ... แต่มันก็ยังใช้งานได้บน 10.5.x

แต่สำหรับปัญหาเฉพาะของคุณ ... คุณได้ลองแล้ว

sudo launchctl list 

สิ่งนี้จะบอกคุณว่า. plist กำลังยิงอย่างถูกต้องหรือไม่ มันจะส่งคืน 1 หาก daemon ไม่ได้เป็น lauching และ '0' จะประสบความสำเร็จ อาจมองหาสิ่งนั้น

เมื่อใดก็ตามที่ฉันเห็น '1' มักจะเป็นเพราะฉันวางสคริปต์ผิดที่ให้พิมพ์ผิดหรือตั้งค่าการอนุญาตไม่ถูกต้อง

อีกทั้ง .... รีบูตบ่อย .. ฉันเคยเห็น

launchctl start

ไม่มีประสิทธิภาพเมื่อรีบูตเครื่อง ..

นอกจากนี้ในการดูคำถามของคุณอย่างใกล้ชิด .... ทำไมไม่เพียงแค่ใส่รหัส rsync นั้นลงใน bash script ... และติดมันใน/usr/bin/..... จากนั้นคุณก็สามารถทำได้เพียงแค่chmod+xไฟล์นั้น .... และทำให้. plist ของคุณง่ายขึ้น เพื่อเริ่มสคริปต์นั้นเมื่อใดก็ตามที่คุณต้องการ ....


ขอบคุณวางคำสั่งลงในแฟ้มเปลือกพิเศษและการเปิดตัวที่ไม่หลอกลวง เป็นวิธีแก้ปัญหาที่ไม่น่าพอใจอย่างมาก ... ทำไมไม่เรียกใช้คำสั่งโดยตรง โดยวิธีการที่launchctl list ไม่แสดงผล 1 launchctl startแต่หลังจากที่ผมเริ่มตัวแทนด้วยตนเองโดยใช้
Konrad Rudolph

ฉันไม่ได้เป็นบวก แต่ฉันคิดว่าไฟล์ launchd .plist นั้นมีไว้เพื่อกำหนดเกณฑ์ 'เรียกใช้ตามความต้องการ' สำหรับ daemons ... บางทีมันอาจไม่แน่ใจว่าจะทำอย่างไรกับอาร์กิวเมนต์ที่คุณได้ส่งผ่าน <key> ProgramArguments </ key>
CaseyIT

11

คำตอบยาว:

เป็นการยากที่จะทำงานกับ launchd โดยไม่เข้าใจหลักการพื้นฐานบางอย่าง ดังนั้นจึงเป็นไปได้ว่าคุณจะไม่พบคำสั่งทีละขั้นตอน แต่ก็มีความสามารถมากมาย การย้ายที่ดีคือไปที่คู่มือการเริ่มต้นใช้งานบน ADC: http://developer.apple.com/macosx/launchd.html

นอกจากนี้คุณยังสามารถอ่านหน้าคนสำหรับlaunchd, launchctlและไวยากรณ์ไฟล์ launchd.plist.plist,

มีความเข้าใจผิดบ่อย ๆ ว่าจะให้ตัวแทนหรือ deamon ของคุณอยู่ที่ไหนดังนั้นให้ฉันผลักดันข้อมูลบางอย่างที่นี่:

  • หากงานของคุณต้องทำงานแม้ว่าจะไม่มีผู้ใช้งานให้ใส่ไว้ใน / Library / LaunchDaemons
  • หากมีประโยชน์เฉพาะเมื่อผู้ใช้ล็อกอินให้วางไว้ใน / Library / LaunchAgents หรือในไดเร็กทอรี LaunchAgents ส่วนบุคคลของผู้ใช้เฉพาะ (~ / Library / LaunchAgents)
  • อย่าวางงานของคุณใน / System / Library ซึ่งสงวนไว้สำหรับ daemons ที่ระบบจัดให้
~/Library/LaunchAgents         Per-user agents provided by the user.
/Library/LaunchAgents          Per-user agents provided by the administrator.
/Library/LaunchDaemons         System wide daemons provided by the administrator.
/System/Library/LaunchAgents   Mac OS X Per-user agents.
/System/Library/LaunchDaemons  Mac OS X System wide daemons.

คำตอบสั้น ๆ :

ชื่อของไฟล์ plist ของคุณอาจจะผิดไม่สามารถทดสอบได้ในขณะนี้ net.madrat.utils.sync.plistแต่ผมจะตั้งค่าให้ อาจเป็นประโยชน์ในการแก้ไขunloaddeamon ของคุณก่อนที่จะโหลดหากคุณแก้ไขไฟล์


ขอบคุณสำหรับข้อมูล. อย่างไรก็ตาม: (1) ฉันได้อ่านเอกสารทั้งหมดที่คุณเชื่อมโยงด้านบนแล้วและอีกมากมาย ไม่มีที่ไหนเลยที่บอกวิธีเปิดตัวแทน (อย่างน้อยฉันก็ไม่พบที่ใดก็ได้) มันจะดีถ้าวิธีการที่ใช้งานง่ายของฉันทำงาน (2) การเปลี่ยนชื่อไฟล์ไม่สามารถทำได้เช่นกัน :-( (3) ข้อมูลบางอย่างล้าสมัยตัวอย่างเช่นพวกเขาแนะนำให้ใช้คำสั่งlaunchd bashสำหรับการดีบั๊ก - แต่มันไม่สามารถใช้กับ Leopard ได้ ( launchdไม่สามารถเปิดใช้งานได้โดยตรง)
Konrad Rudolph

@Konrad Rudolph: ไม่เป็นไร: :) @Skylarking ได้รับคะแนนที่น่าสนใจ: คุณตรวจสอบไฟล์ก่อนหรือไม่? หรือใช้คำสั่ง sudo? ฉันต้องรีบูตบางครั้งเพื่อให้ launchctl ทำงานได้อย่างถูกต้อง
Arko

3

ฉันไม่พบเอกสารว่านี่เป็นพฤติกรรมมาตรฐานจริง ๆ แต่ดูเหมือนว่า launchd ต้องมีพา ธ สัมบูรณ์ในไฟล์ plist ดังนั้นลอง/usr/bin/rsyncแทน ใช้งานได้สำหรับฉัน!


0

ลองนี้สคริปต์ของฉันทำงานโดยไม่ใช้ส่วนของโปรแกรมเพียงแค่เขียนโปรแกรม ...

แทนที่

    <key>Program</key>
    <string>rsync</string>
    <key>ProgramArguments</key>
    <array>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

กับ

    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>rsync</string>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>


0

คุณมีสิ่งหนึ่งที่ผิดพลาดในไฟล์. plist ของคุณและอีกหนึ่งสิ่งที่หลบหลีก (แต่ละประเด็นเหล่านี้ได้รับการสัมผัสจากคำตอบก่อนหน้านี้ฉันกำลังพาพวกเขามาที่นี่)

คุณน่าจะเขียนได้ดีกว่า:

<key>ProgramArguments</key>
<array>
  <string>/usr/local/bin/rsync</string>
  <string>-ar</string>
  <string>/path/to/folder/</string>
  <string>/path/to/backup/</string>
</array>

อาร์กิวเมนต์แรกในProgramArgumentsอาร์เรย์คือโปรแกรมที่จะดำเนินการ - คุณไม่ต้องดำเนินการนี้ หากProgramคีย์ถูกละไว้มันจะมีค่าเริ่มต้นเป็นอาร์กิวเมนต์แรกของProgramArguments; อาจเป็นการดีที่จะระบุเพียงครั้งเดียว

เนื่องจากคุณไม่ได้ระบุอาร์กิวเมนต์แรกนี้. Plist ของคุณจะเรียกใช้ rsync (ผ่านการตั้งชื่อProgram) แต่ 'อาร์กิวเมนต์แรก' ของ rsync จะเป็น/path/to/folderเช่นนั้นและไม่ใช่-ar(โปรแกรมที่ทำงานอยู่จะปรากฏในช่วงสั้น ๆpsก่อนที่จะออกจาก ข้อผิดพลาด แต่ตั้งชื่อเป็น-arซึ่งเป็นเนื้อหาของการโต้แย้งซีร็อค)

คุณไม่จำเป็นต้องใส่เส้นทางไปrsyncแต่ในบริบทเช่นนี้คุณอาจต้องระมัดระวังเพื่อหลีกเลี่ยงการพึ่งพาPATHการตั้งค่าอย่างเหมาะสม

launchd.plist(5)เอกสารสำหรับการนี้อยู่ใน หมายเหตุว่าความเครียด manpage ว่ามูลค่าของที่สำคัญคือการส่งผ่านไปยังProgramArguments execvp(3)เป็นexecvpmanpage ที่อธิบายเกี่ยวกับการค้นหา PATH

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.