Làm thế nào để sử dụng launchd để chạy Scripts trên Schedule trong macOS
launchd là công cụ để bắt đầu, dừng và quản lý các tập lệnh và quy trình. Nếu bạn đã làm việc với bất kỳ phiên bản Linux nào, bạn có thể quen thuộc với cron. launchd về cơ bản là cron trong macOS.
Daemon là gì?
Daemon (phát âm là "quỷ") là các kịch bản chạy ẩn. Không giống như các ứng dụng, các trình tiện ích chạy dưới dạng các tiến trình và không nằm dưới sự kiểm soát trực tiếp của người dùng hoặc ứng dụng khác. Trên macOS, chúng nằm dưới sự chỉ huy của khung công tác launchd quyết định khi nào chúng bắt đầu và dừng lại.
Tên bất thường xuất phát từ con quỷ của Maxwell, một tác nhân tưởng tượng phân loại các phân tử trong một thí nghiệm suy nghĩ nhiệt động lực học.
Viết kịch bản
Để chạy các trình tiện ích thông qua launchd, bạn sẽ cần phải viết một số tập lệnh. Ngôn ngữ kịch bản phổ biến nhất là bash. Nếu bạn muốn tìm hiểu thêm về bash scripting, bạn có thể xem hướng dẫn của người mới bắt đầu để bash scripting.
Sử dụng launchd
Các script trong launchd được kích hoạt bởi các định nghĩa công việc là các tệp .plist được lưu trữ trong các thư mục cụ thể. Các tệp XML này cung cấp tên công việc, chỉ định tập lệnh sẽ được khởi chạy và cho biết khi nào tập lệnh sẽ được chạy. Khi bạn đã viết kịch bản của mình, bạn sẽ viết và tải định nghĩa công việc để khởi chạy tập lệnh vào thời điểm thích hợp.
Định nghĩa công việc trông giống như dưới đây:
Nhãn local.restart Chương trình /Users/user/Scripts/restart.sh RunAtLoad
Sửa đổi khi cần thiết, sau đó đặt nó vào một tệp văn bản có đuôi .plist trước khi thả nó vào đúng thư mục (xem bên dưới).
Có một vài phần quan trọng trong mô tả công việc:
- Nhãn: tên của công việc trong launchd. Phải là duy nhất cho mỗi công việc. Chúng được viết bằng ký hiệu tên miền ngược, và “local” là một tên miền tuyệt vời cho các tác nhân riêng.
- Chương trình: đường dẫn đầy đủ của tập lệnh mà mô tả công việc này khởi chạy.
- RunAtLoad: mô tả khi nào tập lệnh sẽ được chạy. Có một vài tùy chọn khác nhau ở đây:
- RunAtLoad : chạy ngay khi định nghĩa công việc được tải. Chỉ chạy một lần cho mỗi lần tải.
- StartInterval : bắt đầu công việc sau mỗi giây. Ví dụ này sẽ chạy công việc mỗi 7200 giây hoặc 2 giờ một lần.
StartInterval 7200 - StartCalendarInterval : chạy công việc tại một thời điểm và ngày cụ thể. Mã dưới đây sẽ chạy công việc hàng ngày lúc 9 giờ sáng.
StartCalendarInterval Giờ 9 Phút 0
Đại lý so với daemon
Một khi bạn đã viết mô tả công việc của bạn, bạn sẽ cần phải lưu nó trong thư mục thích hợp.
launchd phân biệt rõ hơn giữa các tác nhân và các daemon. Một tác nhân chạy thay mặt cho người dùng đã đăng nhập, trong khi một daemon chạy dưới người dùng root. Điều này có nghĩa là nếu bạn muốn giới hạn một tập lệnh cho một tài khoản người dùng cụ thể, bạn có thể sử dụng một tác nhân. Nếu bạn muốn một cái gì đó để chạy không có vấn đề người đăng nhập, bạn sẽ sử dụng một daemon.
Sự khác biệt giữa các tác nhân và daemon được rút ra từ nơi chúng được lưu trên máy tính:
- “~ / Library / LaunchAgents” chạy thay mặt cho người dùng đã đăng nhập
- “/ Library / LaunchDaemons” thay mặt cho người dùng root
Bạn sẽ cần phải lưu plist của bạn ở vị trí chính xác.
Đang tải công việc vào launchctl
Khi bạn đã tạo tập lệnh và lưu tác nhân của mình vào đúng nơi, bạn sẽ cần tải nó vào launchctl
. Điều này sẽ tự động diễn ra khi đăng nhập trong tương lai.
Để xem những gì hiện đang chạy trong laucnhctl, bạn có thể sử dụng launchctl list
trong terminal. Danh sách khổng lồ này có thể được grepped cho kịch bản của bạn bằng cách ghi nhãn nó với một cái gì đó như sau:
danh sách launchctl | grep local.restart
Để tải một tập lệnh, hãy mở Terminal và sử dụng lệnh sau:
launchctl tải ~ / Library / LaunchAgents / local.restart.plist
Để loại bỏ tập lệnh khỏi hàng đợi launchctl, sử dụng lệnh unload
:
launchctl unload ~ / Library / LaunchAgents / local.restart.plist
Tải một công việc đặt nó vào hàng đợi launchd, và công việc sẽ chạy vào thời điểm được chỉ định trong các điều kiện khởi động của nó. Nếu bạn muốn chạy một kịch bản ngay lập tức bất kể bạn làm gì, bạn nên sử dụng lệnh “start”:
launchctl bắt đầu local.restart
Lệnh này lấy nhãn của công việc và sẽ chỉ hoạt động nếu công việc đã được nạp vào launchctl
.
Phần kết luận
Bạn có thể sử dụng launchd để tạo tập lệnh làm những việc như dọn dẹp tệp, khởi động lại máy chủ của bạn theo lịch biểu hoặc chạy một ứng dụng khi một tệp nhất định xuất hiện. Để tìm hiểu thêm về launchd, bạn có thể xem hướng dẫn laucnhd.
Tín dụng hình ảnh: Maxwell's_demon