Bất cứ ai cũng có thể giới thiệu một hướng dẫn tốt để viết (từ đầu) một công việc launchd theo kiểu cron?


19

Tôi đã có một công việc khá đơn giản mà tôi muốn chạy mỗi giờ. Tôi có thể làm điều đó bằng cách sử dụng cron, nhưng tôi nghĩ tôi sẽ sử dụng điều này để tìm hiểu launchd, vì tôi nghe thấy những điều tốt về nó. Tôi đã có man launchd.plisttrang này làm tài liệu tham khảo, nhưng tôi đang tìm kiếm thứ gì đó dựa trên việc xây dựng một công việc ví dụ.


Điều này nên được chuyển đến Stackoverflow.
Philip Regan

5
@Philip Regan Tôi đã nghĩ về nó, nhưng đối với tôi không có nhiều chương trình liên quan. Nếu tôi hỏi một croncâu hỏi, liệu superuser.com có ​​phải là nơi thích hợp không? Vì launchdlà phiên bản của Apple cron(và cũng có thể daemontools, và có thể cả những thứ khác), tôi nghĩ đây là lựa chọn tốt nhất của tôi.
Hank Gay

Bạn cũng có thể đặt nó trong tập lệnh tự động hóa và chạy từ iCal - nếu nó chạy như bạn
user151019

Trong một chút trớ trêu hài hước, ba năm sau tôi cần tự mình thực hiện quy trình cron / launchd và thấy mình lại nhìn câu hỏi này trong một ánh sáng hoàn toàn khác. Stack Overflow có ý kiến ​​trái chiều về việc phải làm gì với các câu hỏi khởi chạy, nhưng họ thực sự không thích những câu hỏi này. Chỉ cần nghĩ rằng toàn bộ tình huống là thú vị. +1
Philip Regan

Câu trả lời:


14

launchdchạy Daemons ( /Library/LaunchDaemonshoặc /System/Library/LaunchDaemons) với quyền root và sẽ chạy chúng bất kể người dùng có đăng nhập hay không. Đại lý khởi chạy ( /Library/LaunchAgents/hoặc ~/Library/LaunchAgents/) được chạy khi người dùng đăng nhập với tư cách người dùng đó. Bạn không thể sử dụng setuid để thay đổi người dùng đang chạy tập lệnh trên trình nền. Thư mục /Systemđược dành riêng cho các tác vụ Mac OS X, vì vậy tôi khuyên bạn nên đặt các mục của bạn launchdvào /Libraryhoặc ~/Librarythư mục vì nó có ý nghĩa.

Vì vậy, bước đầu tiên là xác định xem bạn đang làm đại lý hay daemon.

Bước thứ hai là tạo .plisttập tin của bạn . Bạn có thể sử dụng các chương trình dựa trên GUI như Lingon để trợ giúp việc này hoặc chỉ sử dụng trình soạn thảo văn bản yêu thích của bạn:

Một mẫu .plistđể chạy tập lệnh mỗi giờ ( StartIntervalhoặc StartIntervalCalendarlà các khóa chúng tôi muốn - StartIntervalcho một mục xảy ra mỗi xgiây, StartIntervalCalendartrong một thời gian và / hoặc ngày cụ thể. Xem 126907 trên SuperUser để biết ví dụ tôi đã tạo với StartCalWikiInterval):

<?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>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>OnDemand</key>
    <true/>
    <key>RunAtLoad</key>
    <false/>
    <key>UserName</key>
    <string>USERNAME HERE</string>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>ProgramArguments</key>
    <array>
        <string>Argument_1</string>
        <string>Argument_2</string>
    </array>
    <key>StartInterval</key>
    <integer>3600</integer>
</dict>
</plist>

Sửa đổi mức .plistcần thiết để trỏ đến tập lệnh của bạn và mọi đối số nếu cần (đối số nằm trên các dòng riêng biệt) và lưu tệp có cùng tên với giá trị Nhãn nhưng .plistở cuối. (ví dụ, local.my-mac.flickrstatssẽ được lưu dưới dạng local.my-mac.flickrstats.plist). Nếu bạn chưa có, hãy di chuyển .plisttệp đó sang /Library/LaunchDaemonskhi tạo Daemon (chạy mọi lúc) hoặc đến ~/Library/LaunchAgents(chỉ bạn đã đăng nhập) hoặc /Library/LaunchAgents(bất kỳ người dùng nào đã đăng nhập).

Để bắt đầu công việc bạn muốn chạy launchctlkhi cần thiết để tải tệp. Đối với các mục trong /Library, bạn nên sử dụng sudo: ví dụ:sudo launchctl load -w /PATH/TO/PLIST

Để tham khảo, hãy xem các câu hỏi sau về Siêu người dùng: Lệnh Launchd với quyền root , Tải một trình nền toàn hệ thốngLàm cách nào tôi có thể có được một tập lệnh để chạy mỗi ngày


4

Tôi biết đó không phải là một hướng dẫn tốt , nhưng bạn có thể xem Hướng dẫn lập trình dịch vụ và Daemons từ Apple, trong đó có một phần về Lập kế hoạch công việc theo thời gian.

Tôi biết nó không phải là một hướng dẫn đầy đủ, nhưng, với nó, bạn có thể hiểu những điều cơ bản launchd.

Nó cũng cung cấp một ví dụ về một crondnhiệm vụ:

<?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>com.apple.periodic-daily</string>
    <key>ProgramArguments</key>
    <array> 
        <string>/usr/sbin/periodic</string>
        <string>daily</string>
    </array>
    <key>LowPriorityIO</key>
    <true/>
    <key>Nice</key>
    <integer>1</integer>
    <key>StartCalendarInterval</key>
    <dict>  
        <key>Hour</key>
        <integer>3</integer>
        <key>Minute</key>
        <integer>15</integer>
    </dict>
</dict>
</plist>

Tôi đã từ chối vì bạn thừa nhận rằng tài nguyên không phải là thứ tôi yêu cầu và nó gây ấn tượng với tôi như một RTFM, nhưng tôi đã suy nghĩ lại và tôi muốn hủy bỏ downvote của mình. Thật không may, tôi không thể trừ khi câu hỏi được chỉnh sửa (đã quá lâu) và tôi chưa có đủ đại diện để chỉnh sửa. Bạn có thể điều chỉnh một cái gì đó? Cảm ơn.
Hank Gay

@Hank Gay: Cảm ơn bình luận của bạn. Tôi cũng chỉnh sửa câu trả lời của mình.
Studer

4

Điều này đã giúp tôi rất nhiều: http://launchd.info

Nó bao gồm cấu hình, quản trị và xử lý sự cố bằng Terminal hoặc GUI LaunchControl . Ví dụ được cung cấp là tốt.


2

Tôi biết bạn đang tìm kiếm một hướng dẫn, nhưng rất có thể ai đó đến đây như một phần của việc tìm kiếm một công cụ để giúp họ thực hiện / chỉnh sửa các mục launchd, tôi đã sử dụng điều này trước đây: Lingon (sourceforge)

Nó không còn được phát triển tích cực nhưng những gì ở đó hoạt động (và rõ ràng bao gồm cả nguồn, v.v.). Tôi đã sử dụng nó trên Snow Leopard để lên lịch sao lưu lên đám mây Amazon, v.v.


Lingon hiện đang ở trong App Store, vì vậy vẫn hoạt động, không phải là miễn phí, xem < peterborgapps.com/lingon >
user151019

Phiên bản cửa hàng ứng dụng đã bị tê liệt bởi các yêu cầu chính sách của Apple. Phiên bản được biên dịch trước SourceForge hoạt động tốt - mặc dù hộp thoại theo chế độ lưu, bảo tôi đăng xuất hoặc khởi động lại để bật trình nền sẽ không loại bỏ. Tôi đã phải thoát khỏi chương trình từ menu của nó (không bắt buộc thoát) và kiểm tra để xác nhận rằng nó đã lưu tệp đúng cách. Bị tê liệt trong tập tin và kích hoạt thư mục đó không được hỗ trợ, cũng không thể tạo ra thứ gì đó chạy bằng root với phiên bản AppStore.
marfarma
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.