Làm thế nào để đăng ký một đại lý với launchd


14

Tôi không thể lên lịch khởi chạy định kỳ với launchctl/ launchdtrên OS X (Leopard). Về cơ bản, tôi không thể tìm thấy danh sách hướng dẫn từng bước trên web và phương pháp trực quan không hoạt động.

Các sync.plisttập tin:

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

Tôi đã đặt đoạn script này vào trong đường dẫn ~/Library/LaunchAgents.

Tiếp theo, tôi đã đăng ký tập lệnh bằng cách sử dụng

launchctl load ~/Library/LaunchAgents/sync.plist

Cuối cùng, để kiểm tra rằng nó hoạt động, tôi bắt đầu công việc:

 launchctl start net.madrat.utils.sync

- Không có chuyện gì xảy ra. Thực hiện thủ công rsynclệnh trong thiết bị đầu cuối mang lại kết quả mong đợi.

Tôi khá chắc chắn rằng công việc đã được đăng ký chính xác bởi vì nếu tôi cố gắng bắt đầu một công việc không tồn tại, tôi nhận được một thông báo lỗi (mà tôi đã không nhận được trong lệnh trên).

Tôi đã làm gì sai?

Câu trả lời:


5

Lingon là một công cụ GUI tốt để quản lý launchd. Dự án dường như không được hỗ trợ ngay bây giờ ... nhưng nó chắc chắn vẫn hoạt động trên 10.5.x.

Nhưng với vấn đề cụ thể của bạn ... bạn đã thử chưa

sudo launchctl list 

Điều này sẽ cho bạn biết nếu .plist bắn chính xác. Nó sẽ trả về 1 nếu daemon không hoạt động và '0' nếu thành công. Có lẽ tìm kiếm điều đó.

Bất cứ khi nào tôi thấy "1" thường là do tôi đã đặt tập lệnh sai vị trí, mắc lỗi đánh máy hoặc đặt quyền không chính xác.

Ngoài ra .... khởi động lại thường xuyên .. Tôi đã thấy

launchctl start

không hiệu quả khi khởi động lại ..

Ngoài ra, khi xem xét câu hỏi của bạn gần hơn .... tại sao không đặt mã rsync đó vào tập lệnh bash ... và dán nó vào /usr/bin/..... Sau đó, bạn có thể chỉ cần chmod+xtệp đó .... và đơn giản hóa .plist của bạn để kích hoạt kịch bản đó bất cứ khi nào bạn muốn ....


Cảm ơn, đưa lệnh vào một tệp shell bổ sung và khởi chạy đã thực hiện thủ thuật. Đó là một giải pháp rất không thỏa đáng mặc dù tại sao không gọi lệnh trực tiếp làm việc? Nhân tiện, launchctl list đã hiển thị 1, nhưng chỉ sau khi tôi khởi động tác nhân bằng tay launchctl start.
Konrad Rudolph

Tôi không tích cực, nhưng tôi nghĩ các tệp launchd .plist thực sự chỉ nhằm mục đích xác định tiêu chí 'khởi chạy theo yêu cầu' cho daemon ... Có lẽ không biết phải làm gì với các đối số bạn đã truyền trong <key> Chương trìnhArgument </ key>.
CaseyIT

11

Câu trả lời dài:

Thật khó để làm việc với launchd mà không hiểu một số nguyên tắc cơ bản. Vì vậy, có khả năng bạn sẽ không tìm thấy bất kỳ hướng dẫn từng bước nào, nó có rất nhiều khả năng. Một động thái tốt là hướng đến hướng dẫn bắt đầu trên ADC: http://developer.apple.com/macosx/launchd.html

Bạn cũng có thể đọc các trang người đàn ông cho launchd, launchctlvà các tập tin cú pháp plist, launchd.plist.

Có một sự hiểu lầm thường xuyên về nơi đặt đại lý hoặc deamon của bạn, vì vậy hãy để tôi đưa một số thông tin về nó ở đây:

  • Nếu công việc của bạn cần chạy ngay cả khi không có người dùng nào đăng nhập, hãy đặt nó vào / Library / LaunchDaemons.
  • Nếu nó chỉ hữu ích khi người dùng đăng nhập, hãy đặt nó vào / Library / LaunchAgents hoặc trong thư mục LaunchAgents cá nhân của những người dùng cụ thể (~ / Library / LaunchAgents).
  • Không đặt công việc của bạn vào / Hệ thống / Thư viện, dành riêng cho trình nền do hệ thống cung cấp.
~/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.

Câu trả lời ngắn:

Tên của tệp plist của bạn có thể sai, không thể kiểm tra ngay bây giờ nhưng tôi sẽ đặt nó thành net.madrat.utils.sync.plist. Nó cũng có thể hữu ích để đầu tiên unloaddeamon của bạn trước khi tải nó nếu bạn chỉnh sửa tập tin.


Cảm ơn bạn về thông tin. Tuy nhiên: (1) Tôi đã đọc tất cả các tài liệu bạn đã liên kết ở trên và một số tài liệu khác. Không nơi nào thực sự nói làm thế nào để khởi động một đại lý. (Ít nhất, tôi đã không tìm thấy nó ở bất cứ đâu.) Sẽ tốt thôi, nếu cách tiếp cận trực quan của tôi đang hoạt động. (2) Thay đổi tên tệp cũng không hoạt động. :-( (3) một số thông tin được lỗi thời Ví dụ, họ đề nghị lệnh. launchd bashĐể gỡ lỗi - nhưng điều này không làm việc trên Leopard ( launchdkhông thể được đưa ra trực tiếp).
Konrad Rudolph

@Konrad Rudolph: Bạn được chào đón: :) @Skylarking nhận được một số điểm thú vị: bạn đã kiểm tra hồ sơ của tập tin chưa? Hoặc sử dụng lệnh sudo? Đôi khi tôi cũng phải khởi động lại để launchctl hoạt động bình thường.
Arko

3

Tôi không thể tìm thấy tài liệu rằng đây thực sự là hành vi tiêu chuẩn, nhưng có vẻ như launchd yêu cầu các đường dẫn tuyệt đối trong các tệp plist. Vì vậy, hãy thử /usr/bin/rsyncthay thế. Làm việc cho tôi!


0

Hãy thử điều này, các kịch bản của tôi hoạt động mà không sử dụng phần chương trình, chỉ cần lập trình chương trình ...

thay thế

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

với

    <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

cố gắng thêm khóa này vào tập tin plist của bạn

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>

0

Bạn có một điều sai trong tệp .plist của bạn và một điều tinh ranh (mỗi điểm này đã được đưa ra trong các câu trả lời trước đó; tôi sẽ đưa chúng lại với nhau ở đây).

Bạn sẽ viết tốt hơn:

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

Đối số đầu tiên trong ProgramArgumentsmảng là chương trình được thực thi - bạn đã bỏ qua điều này. Nếu Programkhóa bị bỏ qua, thì nó mặc định là đối số đầu tiên của ProgramArguments; Có lẽ nên khôn ngoan khi chỉ định điều này một lần.

Bởi vì bạn bỏ qua đối số đầu tiên này, plist của bạn sẽ có rsync Viện dẫn (thông qua được có tên trong Program), nhưng 'đối số đầu tiên' rsync của sẽ có được /path/to/folder, và không -ar(chương trình đang chạy sẽ đã rất ngắn gọn có thể nhìn thấy trong psđầu ra, trước khi nó thoát với một lỗi, nhưng được đặt tên là -ar, đó là nội dung của đối số zeroth).

Bạn không cần phải bao gồm đường dẫn đến rsync, nhưng trong bối cảnh này, có lẽ nên thận trọng khi làm như vậy, để tránh phải dựa vào việc PATHđược đặt một cách thích hợp.

Các tài liệu cho việc này là trong launchd.plist(5). Lưu ý rằng manpage nhấn mạnh rằng giá trị của ProgramArgumentskhóa được truyền vào execvp(3). Đây là execvptrang hướng dẫn giải thích về việc tìm kiếm PATH.

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.