ไม่สามารถเปิด daemon ด้วย launchctl ใน Yosemite


27

ฉันมี launchd daemon ~/Library/LaunchAgentsซึ่งทำงานได้ดีใน Mavericks แต่มันจะไม่เริ่มต้นในเบต้าสาธารณะโยเซมิตี Plist daemon เป็นแบบนี้ (ชื่อผู้ใช้ของฉันคือdarksairกับ UID 501)

<?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>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>LaunchOnlyOnce</key>
    <false/>
    <key>UserName</key>
    <string>darksair</string>
    <key>ProcessType</key>
    <string>Standard</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

โดยทั่วไปมันควรจะทำงาน~/bin/retrmail.pyทุก 5 นาที

ฉันสังเกตเห็นว่าใน Yosemite launchd ได้รับการอัพเกรดเป็น 2.0 และ launchctl มีคำสั่งใหม่ ฉันเหนื่อย

sudo launchctl kickstart user/501/org.darksair.retrmail

และมันก็บอกว่า

Could not find service "org.darksair.retrmail" in domain for uid: 501

ฉันลองโรงเรียนเก่า

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

และมันก็บอกว่า

/Users/darksair/Library/LaunchAgents/retrmail.plist: Path had bad ownership/permissions

ไฟล์นี้เป็นของฉันและกลุ่มพนักงาน ฉันลองทั้งสิทธิ์ 644 และ 600 ด้วยข้อผิดพลาดเดียวกัน

ดังนั้นใครจะรู้วิธีที่จะเปิดตัวภูต launchd ในโยเซมิตีอย่างถูกต้อง?


UPDATE: root:wheelดูเหมือนว่าไฟล์เปิดตัวตัวแทนของฉันจะต้องมีการเป็นเจ้าของโดย หลังจาก chown ฉันพยายาม

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

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


UPDATE2: ไม่ทำงานไม่ถูกต้อง มันทำงานเพียงครั้งเดียว แต่ไม่ใช่อีกครั้งราวกับว่ามันถูกถอดออก


อัปเดต 3: ฉันอัปเกรดเป็นสาธารณะเบต้าโยเซมิตี 3 และเปลี่ยนตัวแทนของฉันเป็นสิ่งนี้

<?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>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>UserName</key>
    <string>darksair</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

ฉันโหลดตัวแทนนี้และฉันคิดว่าตอนนี้มันทำงานได้อย่างถูกต้อง ฉันยังคงเปิดคำถามนี้อยู่เพราะฉันไม่รู้ว่าเกิดอะไรขึ้นกับนักวางแผนก่อนหน้านี้ของฉัน


โดยสรุปสิ่งที่ฉันพบคือฉันต้องเปลี่ยนเจ้าของ Plist เป็นroot:wheelเพื่อโหลด


สิ่งนี้ทำงานในโยเซมิตีได้หรือไม่
TJ Luoma

@TJLuoma: ใช่ ตราบใดที่ Plist เป็นเจ้าของโดย root: wheel
MetroWind

คำตอบ:


21

จาก man launchctl

โปรดทราบว่าไฟล์การกำหนดค่าต่อผู้ใช้ (LaunchAgents) จะต้องเป็นเจ้าของโดย root (หากอยู่ใน / Library / LaunchAgents) หรือผู้ใช้โหลดไฟล์เหล่านั้น (หากอยู่ใน $ HOME / Library / LaunchAgents) daemons ทั่วทั้งระบบทั้งหมด (LaunchDaemons) ต้องเป็นเจ้าของโดย root ไฟล์การกำหนดค่าต้องไม่อนุญาตให้กลุ่มและการเขียนทั่วโลก ข้อ จำกัด เหล่านี้มีขึ้นเพื่อเหตุผลด้านความปลอดภัยเนื่องจากอนุญาตให้เขียนไฟล์การกำหนดค่า launchd ได้เพื่อให้สามารถระบุได้ว่าจะเรียกทำงานไฟล์ใดได้บ้าง

แก้ไขคือ

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist

2
“ หรือผู้ใช้โหลดพวกเขา” <- นี่คือส่วนที่ฉันมีปัญหา
MetroWind

2
ฉันไม่ได้เป็นคนยูนิกซ์ แต่มันบอกว่า "กลุ่มไม่อนุญาตและโลกเขียน" เนื่องจากมันอาจยังจำเป็นต้องอ่านจึงไม่ควรเป็นเช่นนั้นchmod 644?
Jason

5

แปลกพอการใช้sudoเป็นปัญหาของคุณ เมื่อใช้sudoคุณจะไม่เป็นตัวคุณอีกต่อไปดังนั้นคุณจึงไม่ใช่เจ้าของไฟล์ของคุณเอง เอาออกsudoทำซ้ำคำสั่งและมันควรจะโหลดได้ดี ขออภัยสำหรับแนวทางปรัชญาทุกอย่าง


4

พบทางออก

คำสั่งที่ถูกต้องในกรณีนี้คือ

launchctl bootstrap gui/501 ~/Library/LaunchAgents/retrmail.plist

และเพื่อขนถ่าย

launchctl bootout gui/501 ~/Library/LaunchAgents/retrmail.plist

ไม่ทราบว่าทำไมlaunchctl loadต้องใช้รูท แต่การโหลด / ยกเลิกการโหลดนั้นเลิกใช้แล้ว


Man page แสดงรายการ bootout ไม่ใช่ bootcut ฉันคิดว่าการแก้ไขอัตโนมัติมีคุณตั้งแต่เครื่องของฉันมันเปลี่ยน bootout เป็น bootcut
Steve Moser

@MetroWind ฉันได้รับไม่พบโดเมนสำหรับ Code = 112 ข้อผิดพลาดด้วยคำสั่งด้านบน มันไม่สอดคล้องกัน เบาะแสใด ๆ
Parag Bafna

คุณยังต้องการchmod& chown?
Itachi

@Itachi ไม่ ออกจากเจ้าของเริ่มต้นและได้รับอนุญาตควรจะดี
MetroWind

@ParagBafna ฉันไม่แน่ใจ บางทีโพสต์ของคุณไม่ใช่ 501?
MetroWind

3

วิ่งเข้าไปในนี้เช่นกันพยายามที่จะใช้ผู้ใช้ไม่ได้เป็นเจ้าของ. plist (เช่นเดียวกับที่ควรทำ)

$ load ~/Library/LaunchAgents/com.blash.blah.plist
Could not find domain for 

ฉันถูก ssh-ed ลงในเครื่องนี้จากระยะไกลในขณะที่ฉันไม่ได้ลงชื่อเข้าใช้ที่คอนโซล (หัวขาด) ซึ่งดูเหมือนว่าจะเป็นปัญหาของฉัน - อย่างน้อยบริการที่ผู้ใช้จัดการต้องให้ผู้ใช้เข้าสู่ระบบบนหน้าจอหลัก เข้าสู่ระบบผ่านทางระยะไกลการจัดการเช่นนี้เป็นเครื่องหัวขาด)

IMO หากคุณต้องการให้สิ่งนี้ทำงานแม้ว่าคุณจะไม่ได้เป็นการส่วนตัวที่จะเข้าสู่ระบบในตัวเลือกของคุณ:

  • ทำให้การเข้าสู่ระบบบัญชีของคุณโดยอัตโนมัติ (บันทึกความหมายความปลอดภัยรวมทั้งไม่มีแท็กชื่อผู้ใช้ตามที่ระบุไว้ในคำตอบข้อใดข้อหนึ่ง)

  • ทำให้รูทไฟล์เป็นเจ้าของตามที่ระบุไว้ในคำแนะนำต่าง ๆ (การตั้งค่าผู้ใช้ให้เป็นประโยชน์กับคุณด้วยชื่อผู้ใช้ตามที่คุณมี)


2
ขอบคุณมาก. ฉันได้พบทางออกในคำตอบของคุณ
Retraut

2

นี่คือความคิดที่โง่

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

chmod + x'ing แก้ไข

อาจไม่ใช่ปัญหาของคุณ แต่อาจคุ้มค่ากับการถ่ายภาพ :)


สิ่งนี้ไม่ได้ใช้กับกรณีของฉัน ไฟล์สั่งการของฉันมีบิตสิทธิ์ x แต่ขอบคุณสำหรับคำตอบต่อไป หวังว่ามันจะช่วยคนอื่นได้บ้าง
MetroWind

2

ลบUserNameคีย์และสตริง

ปัญหาคือUserNameกุญแจสามารถใช้ได้เฉพาะเมื่อกระบวนการเริ่มต้นโดยรูท มันสามารถเริ่มต้นเป็นรูตได้ถ้าเจ้าของเป็นเจ้าของโดยรูต โดยทั่วไปกระบวนการเริ่มต้นโดยรูทแล้ว suid'ed ให้กับผู้ใช้ที่ระบุ หากคุณต้องการให้กระบวนการนี้ทำงานเป็นของคุณเองให้ใส่โปรแกรม plist ในโฟลเดอร์ ~ / Library / LaunchAgents ของคุณแล้วลบคีย์ชื่อผู้ใช้ออก


ใช้งานได้หลังจากฉันลบตัวเลือก 'ชื่อผู้ใช้' สำหรับ zabbix_agend ขอขอบคุณ! - gist.github.com/chusiang/04db38f5173784e33b68
Chu-Saing Lai

แปลก ๆ ... มันยังคงไม่โหลดหลังจากที่ฉันลบ "ชื่อผู้ใช้" สิ่ง ...
MetroWind

1

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

function as_user {
    local user="$1"
    local user_pid=$(ps -axj | awk "/^$user / {print \$2;exit}")
    local command="sudo launchctl bsexec $user_pid sudo -u '$user' $2"
    echo "Running:"
    echo "$command"
    eval $command
}

function as_current_user {
    as_user "$(whoami)" "$*"
}

function reload_agent {
    as_current_user launchctl unload "$1"
    as_current_user launchctl load "$1"
}

คุณจะใช้สิ่งนี้ดังนี้:

reload_agent ~/Library/LaunchAgents/com.hw.helloworld.plist

bsexec นำคุณกลับมาในโดเมนของคุณและช่วยให้คุณเพิ่มงานเป็นผู้เปิดใช้งานผู้ใช้


มันบอกว่า: /Users/darksair/Library/LaunchAgents/retrmail.plist: กำลังดำเนินการอยู่ ณ จุดนี้คำถามของฉันโดยทั่วไป: ทำไมคำสั่ง kickstart ไม่ทำงาน และทำไมฉันต้องตั้งค่าความเป็นเจ้าของแบบ Plist ให้เป็นรูท…?
MetroWind

1
คุณไม่ควรกำหนดให้เจ้าของไฟล์ plist เป็นรูท ทุกอย่างใน ~ / Library / LaunchAgents ควรเป็นของผู้ใช้ที่เป็นเจ้าของไดเรกทอรีนั้น ฉันได้รับสิ่งที่กำลังดำเนินการอยู่แล้วเมื่อฉันไม่ได้ยกเลิกการโหลดคำสั่งก่อนที่ฉันจะโหลด คุณใช้ฟังก์ชั่นที่ฉันให้ไว้หรือไม่?
imalison

ใช่. ฉันใช้ฟังก์ชั่นของคุณ และฉันก็ทำการ
ปลดเพลทออก

ฉันเพิ่งลองโหลดโปรแกรมแรกที่คุณให้มาและมันก็ใช้ได้กับฉัน สิทธิ์ใดบ้างที่กำหนดไว้สำหรับไฟล์
imalison

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