Không thể khởi chạy trình nền với launchctl trong Yosemite


27

Tôi có một daemon launchd được đặt trong ~/Library/LaunchAgentsđó hoạt động tốt trong Mavericks. Nhưng nó sẽ không bắt đầu trong phiên bản beta công khai Yosemite. Trình tự daemon là như thế này (tên người dùng của tôi là darksairvới 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>

Về cơ bản, nó được cho là chạy ~/bin/retrmail.pycứ sau 5 phút.

Tôi nhận thấy rằng trong launchem Yosemite được nâng cấp lên 2.0 và launchctl có các lệnh mới. Tôi đã thử

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

và nó nói

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

Tôi cũng đã thử trường cũ

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

và nó nói

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

Các tập tin thuộc sở hữu của tôi và nhóm nhân viên. Tôi đã thử cả hai quyền 644 và 600 với cùng một lỗi.

Vì vậy, có ai biết làm thế nào để kích hoạt đúng một daemon launchd trong Yosemite?


CẬP NHẬT: Có vẻ như tập tin đại lý khởi động của tôi phải được sở hữu bởi root:wheel. Sau khi tôi chown, tôi đã cố gắng

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

và nó đã không gây ra bất kỳ lỗi nào. Và tôi nghĩ rằng deamon của tôi đang chạy đúng. Tôi sẽ để câu hỏi này mở vì tôi nhớ tài liệu launchd nói rõ rằng tệp tác nhân khởi chạy có thể được sở hữu bởi người dùng đang chạy daemon.


CẬP NHẬT2: Không, nó không chạy đúng. Nó chỉ chạy một lần, nhưng không chạy lại, như thể nó đã được dỡ xuống.


CẬP NHẬT3: Tôi đã nâng cấp lên phiên bản beta 3 công khai Yosemite và thay đổi đại lý của mình thành

<?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>

Tôi đã tải lại đại lý này, và tôi nghĩ bây giờ nó đang hoạt động tốt. Tôi vẫn để câu hỏi này mở vì tôi không biết có vấn đề gì với câu hỏi trước đây của mình.


Để kết luận, những gì tôi tìm thấy là tôi phải thay đổi chủ sở hữu của plist root:wheelđể tải nó.


Điều này có hoạt động trong trận chung kết Yosemite không?
TJ Luoma

@TJLuoma: có. Miễn là bản gốc được sở hữu bởi root: wheel.
MetroWind

Câu trả lời:


21

Từ man launchctl

Lưu ý rằng các tệp cấu hình trên mỗi người dùng (LaunchAgents) phải được sở hữu bởi root (nếu chúng nằm trong / Library / LaunchAgents) hoặc người dùng tải chúng (nếu chúng nằm trong $ HOME / Library / LaunchAgents). Tất cả các trình nền toàn hệ thống (LaunchDaemons) phải được sở hữu bởi root. Các tập tin cấu hình phải không cho phép ghi nhóm và thế giới. Những hạn chế này được đặt ra vì lý do bảo mật, vì cho phép khả năng ghi vào tệp cấu hình launchd cho phép người ta chỉ định tệp thực thi nào sẽ được khởi chạy.

Sửa là

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

2
Người dùng hoặc người dùng đang tải chúng <- Đây là phần tôi gặp vấn đề.
MetroWind

2
Tôi không phải là một anh chàng unix, nhưng nó nói "không cho phép nhóm và thế giới viết". Vì nó có thể vẫn cần được đọc, nên không chmod 644?
Jason

5

Thật kỳ lạ, sử dụng sudolà vấn đề của bạn. Bằng cách sử dụng sudo, bạn không còn là chính mình, vì vậy bạn không phải là chủ sở hữu của tệp của riêng bạn. Hủy bỏ sudo, lặp lại lệnh và nó sẽ tải tốt. Xin lỗi cho cách tiếp cận triết học cho tất cả.


4

Tìm thấy giải pháp.

Lệnh đúng trong trường hợp này là

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

Và để dỡ hàng,

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

Không biết tại sao launchctl loadyêu cầu root mặc dù, nhưng tải / hủy tải không được chấp nhận.


Man trang liệt kê bootout không bootcut. Tôi nghĩ tự động sửa lỗi có bạn vì trên máy của tôi, nó thay đổi bootout thành bootcut.
Steve Moser

@MetroWind Tôi đang nhận Không thể tìm thấy tên miền cho Code = 112 lỗi với lệnh trên. nó không nhất quán có manh mối nào không?
Parag Bafna

Bạn vẫn cần chmod& & chown?
Itachi

@Itachi, không. Rời khỏi chủ sở hữu mặc định và sự cho phép sẽ ổn.
MetroWind

@ParagBafna, tôi không chắc. Có lẽ UID của bạn không phải là 501?
MetroWind

3

Chạy vào đây cũng vậy, cố gắng sử dụng người dùng, không phải root .plist (như người ta có thể làm được)

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

Tôi đã ssh-ed vào máy này từ xa trong khi tôi KHÔNG đăng nhập vào bảng điều khiển (không đầu) dường như là vấn đề của tôi - ít nhất là các dịch vụ do người dùng quản lý cần người dùng đăng nhập trên màn hình chính (cuối cùng tôi đã làm đăng nhập thông qua quản lý từ xa vì đây là một máy không đầu)

IMO, nếu bạn muốn điều này chạy ngay cả khi bạn không ở đó để đăng nhập tùy chọn của mình là:

  • Tự động đăng nhập tài khoản của bạn (lưu ý hàm ý bảo mật, cũng không có thẻ UserName như được ghi chú trong một trong các câu trả lời)

  • Làm cho các tập tin gốc được sở hữu như được ghi chú trong các đề xuất khác nhau (thiết lập hiệu quả người dùng trở lại của bạn với Tên người dùng như bạn đã có)


2
Cảm ơn bạn rất nhiều. Tôi đã tìm thấy giải pháp trong câu trả lời của bạn.
Retraut

2

Đây là một ý tưởng ngớ ngẩn.

Tôi cũng gặp lỗi tương tự, sau khi đã nâng cấp lên Yosemite. Tôi đã nhầm tưởng rằng nó có nghĩa là quyền sở hữu / quyền xấu đối với tệp .plist, trong khi thực tế, vì một lý do nào đó, nhị phân mà tôi đang tham chiếu trong số nguyên (trong trường hợp của tôi là cassandra), đã mất bit thực thi.

chmod + x'ing nó đã sửa nó.

Có lẽ không phải là vấn đề của bạn, nhưng có thể đáng để thử :)


Điều này không áp dụng cho trường hợp của tôi mặc dù. Thực thi của tôi không có bit cho phép x. Nhưng dù sao cũng cảm ơn bạn đã trả lời. Hy vọng nó có thể giúp một số người khác.
MetroWind

2

Hủy bỏ UserNamekhóa và chuỗi.

Vấn đề là UserNamekhóa chỉ có thể được sử dụng nếu quá trình được bắt đầu bằng root. Nó chỉ có thể được bắt đầu như root nếu plist được sở hữu bởi root. Về cơ bản, quá trình được bắt đầu bằng root và sau đó được sử dụng cho người dùng được chỉ định. Nếu bạn muốn quá trình này tự chạy, hãy đặt số nguyên trong thư mục ~ / Library / LaunchAgents của bạn và xóa khóa Tên người dùng.


Nó hoạt động sau khi tôi xóa tùy chọn 'Tên người dùng' cho zabbix_agend. Cảm ơn bạn! - gist.github.com/chusiang/04db38f5173784e33b68
Chu-Saing Lai

Strange Strange Nó vẫn không tải sau khi tôi gỡ bỏ thứ "Tên người dùng"
Google

1

Có phải bạn đang cố tải lại một cách thủ công một tác nhân có quyền người dùng? Tôi hoàn toàn không hiểu tại sao bất kỳ điều này là bắt buộc, nhưng tôi tin rằng bạn cần phải được đính kèm với miền người dùng của mình (có vẻ như bạn không bị ràng buộc khi bạn chạy bằng root). Sử dụng các chức năng này để reattach làm việc cho tôi.

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"
}

Bạn sẽ sử dụng điều này như sau:

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

Bsexec đưa bạn trở lại miền của bạn và cho phép bạn thêm tác vụ với tư cách là người dùng.


Nó nói: /Users/darksair/L Library / LabAgents / rretrmail.plist: Hoạt động đã được tiến hành. Tại thời điểm này, câu hỏi của tôi về cơ bản là: tại sao lệnh khởi động không hoạt động? Và tại sao tôi phải thiết lập quyền sở hữu chính thức để root gốc?
MetroWind

1
Bạn KHÔNG nên đặt chủ sở hữu của tệp plist của mình là root; mọi thứ trong ~ / Library / LaunchAgents nên được sở hữu bởi người dùng mà thư mục đó thuộc về. Tôi đã nhận được Hoạt động đã được tiến hành khi tôi không tải lệnh trước khi tôi tải nó. Bạn đang sử dụng chức năng mà tôi cung cấp?
imalison

Vâng. Tôi đã sử dụng chức năng của bạn. Và tôi đã dỡ bỏ bản plist đầu tiên
MetroWind

Tôi vừa thử tải bản đầu tiên bạn cung cấp và nó hoạt động với tôi. Những quyền nào được thiết lập cho tập tin?
imalison

Đây là một đoạn mã đáng kinh ngạc cho rất nhiều thứ. Tôi đang sử dụng hỗn hợp các tập lệnh bash rối và tùy chỉnh để quản lý nhiều thiết bị macOS khác nhau và các sự cố ngẫu nhiên vì phiên kiểm toán bảo mật hoặc miền người dùng không chính xác là rất phổ biến. Công việc tuyệt vời
Andrew White
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.