ฉันจะรันคำสั่ง launchd ในฐานะ root ได้อย่างไร


32

ฉันมีคำสั่ง launchctl ต่อไปนี้เป็นไฟล์. plist มีการโหลดและตั้งค่าให้ทำงานวันละครั้ง แต่จำเป็นต้องเรียกใช้ในฐานะรูทและฉันไม่แน่ใจว่าจะยืนยันได้อย่างไร

นอกจากนี้งาน cron นี้โดยทั่วไปซีดีลงในไดเรกทอรีและเรียกใช้คำสั่ง ฉันแน่ใจว่า launchd มีวิธีที่ดีกว่าในการระบุไดเรกทอรีที่ควรรันคำสั่ง

ฉันจะรู้ได้อย่างไรว่ามันทำงานเหมือนรูทและมีวิธีเขียนที่ดีกว่านี้หรือไม่?

<?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>dev.project.frontpage.feedparser</string>
    <key>ProgramArguments</key>
    <array>
        <string>cd</string>
        <string>/Users/eman/src/project/trunk/includes/;</string>
        <string>./feed-parser.php</string>
        <string>-c</string>
        <string>./feed-parser-config.xml</string>
    </array>
    <key>QueueDirectories</key>
    <array/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>12</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>WatchPaths</key>
    <array/>
</dict>
</plist>

คำตอบ:


46

โฟลเดอร์คืออะไร .plistเก็บอยู่ใน?

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

เนื่องจากคุณจะต้องการเพิ่มใน/Library/LaunchDaemonsคุณจะต้องแน่ใจว่าคุณโหลดมันlaunchdด้วยสิทธิ์ผู้ดูแลระบบ (เช่นsudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist )

ตรวจสอบman launchdข้อมูลเพิ่มเติม


ขอขอบคุณ. นี่คือสิ่งที่ฉันกำลังมองหาเท่าที่ตอบปัญหาราก สคริปต์อยู่ใน / Library / LaunchDaemons ดังนั้นมันจึงรันเป็น root แล้ว
Emmanuel Mwangi

คำถามเกี่ยวกับมือใหม่: launchctlจำเป็นต้องมีการติดตั้ง daemon หรือไม่? ฉันหมายความว่ามันไม่เพียงพอที่จะคัดลอกไฟล์ plist ไปยังเส้นทางที่สอดคล้องกัน?
Claudix

@Claudix: ถูกต้อง การคัดลอกการกำหนดค่า Launchd ไม่เพียงพอ - คุณยังต้อง "เปิดใช้" (โหลด Launchctl)
Chealion

4

คุณได้ลองใช้โปรแกรมแก้ไขด่วนตัวใดตัวหนึ่งหรือไม่?

  • Lingon (ทอดทิ้ง แต่ควรทำงานกับเสือดาวและเสือดาวหิมะ)
  • Launchd Editor
  • launchctl

เพื่อให้แน่ใจว่ารันเป็นรูทฉันค่อนข้างมั่นใจว่า launchd จะรันโปรแกรมเป็นรูท เคยคิดที่จะให้ความเป็นเจ้าของสคริปต์ในการรูทโดยใช้ chmod หรือไม่? วิธีนี้จะไม่ทำงานจนกว่าจะทำงานเป็นรูท คุณต้องตรวจสอบว่ามันทำงาน

sudo chown root:admin script_to_run_by_launchd

ฉันใช้ Lingon เพื่อเขียนสคริปต์นี้ และฉันสามารถยืนยันได้ว่ามันทำงานได้ดีใน Leopard
Emmanuel Mwangi

3

รายการคุณสมบัติใน LaunchAgents ยังใช้งานได้ แต่คุณต้องโหลดทั้งเอเจนต์และ daemons ด้วย sudo:

sudo chown root /Library/LaunchAgents/test.plist
sudo launchctl load /Library/LaunchAgents/test.plist

หาก Plist ไม่มีคีย์ที่ปิดใช้งานมันจะถูกโหลดในการล็อกอินครั้งถัดไปหรือรีสตาร์ทโดยค่าเริ่มต้นและ-wไม่จำเป็น

หมายเหตุทางเทคนิค TN2083: Daemons และตัวแทน :

daemon เป็นโปรแกรมที่ทำงานในพื้นหลังโดยเป็นส่วนหนึ่งของระบบโดยรวม (นั่นคือมันไม่ได้เชื่อมโยงกับผู้ใช้รายใดรายหนึ่ง) daemon ไม่สามารถแสดง GUI ได้ โดยเฉพาะอย่างยิ่งมันไม่ได้รับอนุญาตให้เชื่อมต่อกับเซิร์ฟเวอร์หน้าต่าง

[ ... ]

ตัวแทนคือกระบวนการที่ทำงานในพื้นหลังในนามของผู้ใช้เฉพาะ เอเจนต์มีประโยชน์เพราะพวกเขาสามารถทำสิ่งที่ daemons ไม่สามารถทำได้เช่นเข้าถึงโฮมไดเร็กตอรี่ของผู้ใช้หรือเชื่อมต่อกับเซิร์ฟเวอร์หน้าต่าง


3

สำหรับ Googler ที่ต้องการเรียกใช้ Launch Agentโดยเฉพาะด้วยสิทธิ์รูทที่ใช้งานDaemon ของมันสามารถทำได้โดย:

  • สร้าง LaunchAgent ของคุณใน ~/Library/LaunchAgents
  • เรียกใช้แอปพลิเคชันของคุณsudoผ่านProgramArgumentsคุณสมบัติใน Plist ของคุณ
  • ตั้งค่าNOPASSWDตัวเลือกสำหรับแอปพลิเคชันของคุณใน/etc/resolvers.d

สำหรับรายละเอียดเพิ่มเติมโปรดดูที่นี้และนี้คำตอบ


2

LaunchControlทำให้ฉันเจ็บปวดในโยเซมิตี มันมี GUI ลาก -n-drop ที่ดีที่จะช่วยคุณสร้างหรือแก้ไขบริการ มันน่าแปลกใจที่เห็นบริการทั้งหมดที่ฉันไม่รู้

ขั้นตอน

  1. เริ่ม LaunchControl
  2. การเปลี่ยนแปลงซ้ายบนเป็น GlobalDeamons และป้อนรหัสผ่านผู้ดูแลระบบของคุณ
  3. File-> New
  4. ใต้ป้ายกำกับให้ตั้งชื่อที่ไม่ซ้ำกัน การประชุมคือ "com.company.appname"
  5. ภายใต้โปรแกรมให้เรียกใช้ใช้สคริปต์ Unix Shell หรือคำสั่งใดก็ได้ที่คุณต้องการโดยไม่มีข้อโต้แย้ง
  6. หากแอปของคุณต้องการอาร์กิวเมนต์ให้เปลี่ยนฟิลด์ดรอปดาวน์จาก "Default argv" เป็น "Custom argv"
    1. ตอนนี้ให้อาร์กิวเมนต์ที่คุณทำตามปกติเหมือนที่คุณเรียกใช้จากบรรทัดคำสั่งจริง
  7. เรียกใช้ที่โหลดเป็นตัวเลือกคุณเป็นผู้ตัดสินใจ
  8. จากด้านขวาให้ลากแล้วปล่อย StartInterval แล้วตั้งช่วงเวลาที่คุณต้องการ คำถามที่พบบ่อยภายใต้เมนูช่วยเหลือดีมาก

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