Làm cách nào để đặt một nhiệm vụ chạy thường xuyên?


84

Làm cách nào để tôi có một tập lệnh chạy cứ sau 30 phút? Tôi cho rằng có nhiều cách khác nhau cho các hệ điều hành khác nhau. Tôi đang sử dụng OS X.

Câu trả lời:


136

Chỉ cần sử dụng launcherd . Nó là một hệ thống launcher rất mạnh và trong khi đó nó là hệ thống launcher tiêu chuẩn cho Mac OS X (phiên bản OS X hiện tại thậm chí sẽ không khởi động được nếu không có nó). Đối với những người không quen thuộc với launchd(hoặc với OS X nói chung), nó giống như một lai giữa init, cron, at, SysVinit ( init.d), inetd, upstartsystemd. Các khái niệm vay mượn của tất cả các dự án này, nhưng cũng cung cấp những thứ bạn có thể không tìm thấy ở nơi khác.

Mỗi dịch vụ / nhiệm vụ là một tệp. Vị trí của tệp phụ thuộc vào các câu hỏi: "Khi nào thì dịch vụ này sẽ chạy?" và "Dịch vụ sẽ cần những đặc quyền nào?"

Nhiệm vụ hệ thống chuyển đến

/Library/LaunchDaemons/

nếu chúng sẽ chạy, bất kể người dùng có đăng nhập vào hệ thống hay không. Chúng sẽ được bắt đầu với đặc quyền "root".

Nếu chúng chỉ chạy khi có bất kỳ người dùng nào đã đăng nhập, chúng sẽ chuyển đến

/Library/LaunchAgents/

và sẽ được thực thi với các đặc quyền của người dùng vừa đăng nhập.

Nếu họ chỉ chạy khi bạn đã đăng nhập, họ sẽ truy cập

~/Library/LaunchAgents/

ở đâu ~ là thư mục HOME của bạn. Các tác vụ này sẽ chạy với các đặc quyền của bạn, giống như thể bạn đã tự bắt đầu chúng bằng dòng lệnh hoặc bằng cách nhấp đúp vào tệp trong Finder.

Lưu ý rằng cũng có tồn tại /System/Library/LaunchDaemons/System/Library/LaunchAgents, nhưng như thường lệ, mọi thứ bên dưới /Systemđược quản lý bởi OS X. Bạn sẽ không đặt bất kỳ tệp nào ở đó, bạn sẽ không thay đổi bất kỳ tệp nào ở đó, trừ khi bạn thực sự biết mình đang làm gì. Lộn xộn trong thư mục Hệ thống có thể làm cho hệ thống của bạn không sử dụng được (đưa nó vào trạng thái thậm chí sẽ từ chối khởi động lại). Đây là các thư mục nơi Apple đặt các launchdtác vụ giúp hệ thống của bạn khởi động và chạy trong khi khởi động, tự động khởi động các dịch vụ theo yêu cầu, thực hiện các tác vụ bảo trì hệ thống, v.v.

Mỗi launchdnhiệm vụ có một tệp ở định dạng plist. Nó phải có ký hiệu tên miền ngược lại. Ví dụ: bạn có thể đặt tên cho nhiệm vụ của mình

com.example.my-fancy-task.plist

Bảng xếp hạng này có thể có nhiều tùy chọn và cài đặt khác nhau. Viết mỗi tay một cái là không tối ưu, bạn có thể muốn nhận công cụ miễn phí Lingon để tạo các nhiệm vụ của mình. Công cụ này trước đây là miễn phí, bây giờ nó có giá 5 đô la trong cửa hàng ứng dụng và 10 đô la cho phiên bản không phải cửa hàng ứng dụng (phiên bản không phải cửa hàng ứng dụng mạnh hơn nhiều và nếu bạn đã có kế hoạch trả tiền, nghiêm túc, hãy tải xuống cửa hàng không ứng dụng phiên bản). Nếu ai đó biết một công cụ có thể so sánh là phần mềm miễn phí hoặc mã nguồn mở, hãy gửi cho tôi một dòng trong phần nhận xét và tôi muốn giới thiệu công cụ đó hơn (không muốn quảng cáo ở đây cho phần mềm thương mại).

Chỉ là một ví dụ, nó có thể trông như thế này

<?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.example.my-fancy-task</string>
    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/usr/local/bin/my-script.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>1800</integer>
</dict>
</plist>

Tác nhân này sẽ chạy tập lệnh shell /usr/local/bin/my-script.sh sau mỗi 1800 giây (30 phút một lần). Bạn cũng có thể chạy tác vụ vào những ngày / giờ nhất định (về cơ bản, launcd có thể làm mọi thứ mà cron có thể làm) hoặc thậm chí bạn có thể vô hiệu hóa "OnDemand" khiến launcd giữ quá trình chạy vĩnh viễn (nếu nó thoát hoặc gặp sự cố, launcd sẽ ngay lập tức khởi động lại) . Bạn thậm chí có thể giới hạn lượng tài nguyên mà một quy trình có thể sử dụng (như đã nói trước đây, Lingon hiển thị tất cả các cài đặt này trong một giao diện UI đẹp mắt).

Cập nhật: Mặc dù OnDemandvẫn được hỗ trợ nhưng nó không được dùng nữa. Cài đặt mới được đặt tên KeepAlive, có ý nghĩa hơn nhiều. Nó có thể có một giá trị boolean, trong trường hợp này nó là hoàn toàn trái ngược của OnDemand(thiết lập nó để falsecư xử như thể OnDemandtruevà chiều ngược lại). Tính năng mới tuyệt vời là nó cũng có thể có giá trị từ điển thay vì giá trị boolean. Nếu nó có giá trị từ điển, bạn có một số tùy chọn bổ sung cho phép bạn kiểm soát hạt mịn hơn trong những trường hợp mà nhiệm vụ sẽ được duy trì. Ví dụ: nó chỉ được duy trì hoạt động miễn là chương trình kết thúc với mã thoát bằng 0, chỉ khi một tệp / thư mục nhất định trên đĩa tồn tại, chỉ khi một tác vụ khác còn tồn tại hoặc chỉ khi mạng hiện đang hoạt động.

Ngoài ra, bạn có thể bật / tắt các tác vụ theo cách thủ công thông qua dòng lệnh:

launchctl <command> <parameter>

lệnh có thể được tải hoặc dỡ xuống, để tải một plist hoặc dỡ bỏ nó lần nữa, trong trường hợp đó tham số là đường dẫn đến tệp. Hoặc lệnh có thể là bắt đầu hoặc dừng, chỉ bắt đầu hoặc dừng một tác vụ như vậy, trong trường hợp đó tham số là nhãn (com.example.my-ưa thích-nhiệm vụ). Các lệnh và tùy chọn khác cũng tồn tại.

Xem tài liệu của Apple về định dạng plistlaunchctlcông cụ dòng lệnh (lưu ý rằng bạn có thể chọn phiên bản OS X ở trên cùng, vì định dạng / tùy chọn khác nhau giữa các bản phát hành OS X khác nhau)


Điều gì sẽ xảy ra nếu tôi là người dùng muốn một thứ gì đó chạy ngay cả khi tôi không đăng nhập? Điều đó có được không, hay tôi phải yêu cầu quản trị viên đưa thứ gì đó vào / Library / LaunchDaemons?
Mark Baker

@Mark: vâng, quản trị viên của bạn sẽ phải làm điều này và các khóa UserName và GroupName sẽ phải được đặt thích hợp trong tệp .plist.
Steve Folly

Cũng lưu ý rằng đối với Leopard và hơn thế nữa, OnDemand không được chấp nhận thay vì khóa KeepAlive. man launcd.plist để biết thêm chi tiết.
Steve Folly

1
LaunchControl soma-zone.com/LaunchControl rất hữu ích, nó có bản dùng thử không giới hạn, theo như tôi có thể nói là không có giới hạn so với phiên bản được cấp phép.
BaneOfSerenity

1
@MaciekRek StartCalendarIntervalvới một mảng gồm hai từ điển, đều có khóa Minutevà giá trị một lần 00và một lần 30sẽ thực hiện chính xác những gì bạn yêu cầu. Vui lòng đặt câu hỏi trong tương lai dưới dạng câu hỏi, không phải dưới dạng nhận xét, sau đó tôi cũng có thể cho bạn xem từ điển cuối cùng (tôi không thể làm điều đó trong nhận xét). Trang web này là tất cả về việc đặt câu hỏi. Nếu bạn muốn gợi ý cho ai đó về câu hỏi, hãy đăng liên kết đến câu hỏi dưới dạng nhận xét chứ không phải chính câu hỏi.
Mecki

46

bạn có thể sử dụng trình tạo plist rất tiện lợi: http://launched.zerowidth.com/ (không cần mua bất cứ thứ gì…)

nó sẽ cung cấp cho bạn một vỏ một lót để đăng ký một công việc theo lịch trình mới với đã khuyến cáo launchd


11

Trên MacOSX, bạn có ít nhất các tùy chọn sau:

Từ kinh nghiệm cá nhân, cron là đáng tin cậy nhất. Khi tôi thử nghiệm, Launcd có một số lỗi và lỗi. Báo thức iCal chỉ chạy khi bạn đã đăng nhập (nhưng đó có thể là thứ bạn thích).


8

Như Mecki đã chỉ ra, Launcd sẽ là cách để thực hiện điều này. Có một giao diện GUI cho launcd gọi là Lingon mà bạn có thể muốn xem, thay vì chỉnh sửa các tệp launcd bằng tay:

Lingon là giao diện người dùng đồ họa để tạo tệp cấu hình khởi chạy chỉnh sửa cho Mac OS X Leopard 10.5.

[snip ...]

Việc chỉnh sửa tệp cấu hình dễ dàng hơn bao giờ hết trong phiên bản này và nó có hai chế độ khác nhau. Chế độ Cơ bản có sẵn các cài đặt phổ biến nhất trong một giao diện rất đơn giản và Chế độ Chuyên gia, nơi bạn có thể thêm tất cả cài đặt trực tiếp trong văn bản hoặc chèn chúng qua menu.


Thành thật mà nói, đây là một giao diện tuyệt vời, dễ sử dụng, chỉ cần hoàn thành và cho phép bạn tiếp tục. Nếu bạn thiếu thời gian, đây là cách để đi.
Joshua Pinter

4

MAC OS có Automator Công cụ đó là giống như của Task Scheduler trong cửa sổ. Và bằng cách sử dụng Automator, bạn có thể lên lịch nhiệm vụ hàng ngày và liên kết nhiệm vụ với sự kiện lịch định kỳ để chạy các tập lệnh vào thời gian cụ thể hàng ngày. tham khảo liên kết để chạy các tập lệnh hàng ngày trong Mac OS


Ít nhất là trong macOS Catalina (10.15.x), tôi không thể tìm thấy cách lập lịch tác vụ trong Lịch thông qua Automator. Tôi đã có nhiều kết quả tốt hơn với Lingon (xem các câu trả lời khác được đề cập như một giao diện để khởi chạy).
calvinf

2

Đối với tập lệnh apple, tôi thiết lập lịch iCal đặc biệt và sử dụng báo thức để chạy chúng theo định kỳ. Đối với các công cụ dòng lệnh, tôi sử dụng launcherd.


1

FYI: trong khi tôi rất nhớ nó là sự đơn giản, cron đã là dĩ vãng trên OS X. Nó là cơ quan giám sát trên con báo. Kể từ khi Tiger nó đã được ra mắtd. Vì vậy, nếu bạn đang chạy Leopard cron không phải là một lựa chọn.


0

Bạn có thể sử dụng cron để lên lịch tác vụ.

crontab -e

Một công việc được chỉ định ở định dạng sau.

* * * * *  command to execute
│ │ │ │ │
│ │ │ │ └─── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
│ │ │ └──────── month (1 - 12)
│ │ └───────────── day of month (1 - 31)
│ └────────────────── hour (0 - 23)
└─────────────────────── min (0 - 59)

Thí dụ:

0 12 * * *  cd ~/backupfolder && ./backup.sh

Sau khi cài đặt các tác vụ cron, bạn có thể sử dụng crontab -l để liệt kê các tác vụ của mình.

crontab -l

Nếu muốn biết thêm về biểu thức lịch cron, bạn có thể truy cập

https://crontab.guru https://ole.michelsen.dk/blog/schedule-jobs-with-crontab-on-mac-osx.html

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.