Cron là trình hẹn giờ mạnh mẽ, cho phép lên lịch các lệnh, script và chạy chúng một cách thường xuyên. Script được lên lịch chạy nằm trong file crontab. File này có thể hơi "đáng sợ" khi nhìn thấy lần đầu, nhưng khi đã quen bạn có thể nắm bắt nó khá dễ dàng.
Trong một số bản phân phối Linux, như Arch Linux, cron không được cài đặt theo mặc định vì chúng đã sử dụng systemd thay thế cron. Ngoài ra, có nhiều phương pháp sử dụng cron khác nhau và mỗi phương án có cách chỉnh sửa hoặc lập lịch công việc riêng. Hướng dẫn này sẽ tập trung vào cronie, tùy chọn mặc định trong hầu hết các bản phân phối Linux, như Ubuntu.
Sử dụng Cron để lên lịch tác vụ trong Linux
Xem các mục cron
Xem crontab cho phép người dùng xem các tác vụ theo lịch trình sẽ chạy trong tài khoản.
crontab -l
Người dùng cũng có thể xem các tác vụ theo lịch trình cho tài khoản root bằng cách sử dụng sudo.
sudo crontab -l
Chỉnh sửa các mục cron
Nếu chưa bao giờ thiết lập một tác vụ trong cron, file này sẽ trống hoặc có một vài nhận xét. Để thêm một mục, hãy mở file crontab bằng cách sử dụng tùy chọn -e.
crontab -e
Các mục Crontab sẽ luôn tuân theo cùng một cú pháp, cho phép người dùng kiểm tra các mục trên bất kỳ máy nào cũng như tạo chúng theo chương trình.
Cú pháp cơ bản cho biểu thức nhập crontab là:
m h d mon dow command
- m = Phút (trong khoảng từ 0 đến 59)
- h = Giờ (từ 0 đến 23)
- d = Ngày trong tháng (từ 1 đến 31)
- mon = Tháng (từ 1 đến 12)
- dow = Ngày trong tuần (từ 0 đến 6). 0 là chủ nhật.
- Command = Lệnh chạy.
Ví dụ, bạn cần chạy một lệnh thường xuyên để kiểm tra xem máy chủ mysql có chạy tốt không. Để thực hiện lệnh chạy hàng giờ, sử dụng cú pháp sau:
0 * * * * mysqlcheck --all-databases --check-only-changed --silent
Điều này có nghĩa là lệnh sẽ chạy mỗi giờ. Nếu bạn chỉ muốn nó chạy vào lúc 1:42 sáng mỗi ngày, thì lệnh sẽ trở thành:
42 1 * * * mysqlcheck --all-databases --check-only-changed --silent
Ngoài ra, dấu phẩy có thể được sử dụng để liệt kê nhiều mục (chẳng hạn như 1, 3, 5) và dấu gạch nối có thể được sử dụng cho các phạm vi. Việc sử dụng đặc biệt dấu hoa thị ở vị trí của một mục trong biểu thức cho biết mục đó sẽ chạy cho tất cả các giá trị của trường. (Một dấu hoa thị trong trường giờ có nghĩa là lệnh sẽ chạy mỗi giờ, từ 0 - 23.) Dấu thăng (#) trên một dòng cho biết đây là comment (có nghĩa là dòng code sẽ không được thực thi).
Cuối cùng, một dấu gạch chéo về phía trước sẽ chỉ ra một giá trị bước (giá trị tăng sau mỗi lần lặp). Ví dụ, cứ sau 5 phút sẽ được biểu thị là */5 (kể từ thời điểm crontab được lưu và công việc định kỳ được tạo). Nếu chỉ sử dụng “5”, thì mục nhập sẽ chỉ chạy ở mốc 5 phút.
Ví dụ:
34 3 * * 0 mysqlcheck --all-databases --check-only-changed --silent
- 34: Phút để chạy trong khoảng từ 0 đến 59
- 3: Giờ, từ 0 đến 23
- *: Hai dấu sao ở giữa biểu thị lệnh sẽ chạy mỗi ngày (1 đến 31) và mỗi tháng (1 đến 12)
- 0: Số 0 cuối cùng cho biết ngày chạy lệnh sẽ là chủ nhật
Nhiệm vụ này sẽ chạy vào lúc 3:34 sáng hàng tháng, mỗi tuần vào Chủ nhật.
Các short code
Crontab cho phép người dùng sử dụng một số short code để làm cho các mục cron dễ đọc hơn.
- @reboot - Chạy một lần, khi khởi động
- @yearly - Chạy mỗi năm một lần, “0 0 1 1 *”.</>
- @annual - Giống như @yearly
- @monthly - Chạy mỗi tháng một lần, “0 0 1 * *”
- @weekly - Chạy mỗi tuần một lần, “0 0 * * 0”
- @daily - Chạy mỗi ngày một lần, “0 0 * * *”
- @midnight - giống như @daily
- @hourly - Chạy mỗi giờ một lần, “0 * * * *”
Ví dụ:
@hourly mysqlcheck --all-databases --check-only-changed --silent
Chỉnh sửa các mục cron với vai trò một người dùng khác
Có những lúc người dùng cần thêm một crontab với quyền root. Ví dụ, để tự động gia hạn chứng chỉ Let’s Encrypt SSL thì cần chạy tập lệnh gia hạn với quyền root. Để chỉnh sửa crontab với quyền root, chỉ cần thêm sudo trước lệnh:
sudo crontab -e
Tương tự, có thể lên lịch công việc trong cron với vai trò của một người dùng khác, bằng cách sử dụng flag -u:
sudo crontab -u username -e
Ví dụ, để chạy một công việc định kỳ với tư cách là người dùng “www-data” , hãy sử dụng lệnh sau:
sudo crontab -u www-data -e
Xem lại hoạt động cron
Bây giờ các lệnh hoặc tập lệnh cụ thể đã được thiết lập, nhưng người dùng cần đảm bảo chúng chạy. Tích hợp vào cron có nghĩa là một khi lệnh được chạy, cron sẽ gửi email cho chủ sở hữu. Điều này có thể được thay đổi với biến MAILTO.
Thêm MAILTO=youremail@yourdomain.com sẽ gửi tất cả các báo cáo công việc định kỳ đến một email được chỉ định. Biến này thường có thể được tìm thấy ở đầu màn hình chỉnh sửa crontab. Tuy nhiên, nếu nó không ở đó, người dùng có thể tự thêm biến và nó sẽ hoạt động như mong muốn.
Nhiều địa chỉ email có thể được phân tách bằng dấu phẩy. Nếu cần một lệnh được gửi qua email đến một nơi khác, hãy thêm lệnh MAILTO ngay phía trên lệnh. Các lệnh sau MAILTO sẽ được gửi đến địa chỉ mới. Nếu để MAILTO= trống, thông báo sẽ được gửi đến chủ sở hữu của mục cron.
Ngoài ra, bạn cũng có thể sử dụng toán tử chuyển hướng (>) để gửi đầu ra khi cần.
34 3 * * 0 mysqlcheck --all-databases --check-only-changed --silent > /dev/null
Lệnh trên sẽ chuyển hướng đầu ra thành “/dev/null”, không gửi email và loại bỏ đầu ra.
Nếu muốn đảm bảo một công việc đã được thực hiện nhưng không muốn nhận email, người dùng cũng có thể kiểm tra nhật ký cron. Trên hầu hết các hệ thống, việc truy cập nhật ký cron sẽ yêu cầu quyền superuser. Nhật ký cron có thể được tìm thấy trong “/var/log”. File cron hoặc syslog sẽ hiển thị nhật ký của các mục cron đã thực hiện.
sudo grep crontab syslog
Cron có thể được thu hẹp hơn nữa để cho phép mục đích sử dụng cụ thể và các tùy chọn mặc định có thể được thiết lập. Tóm lại, cron là công cụ cung cấp cho người dùng khả năng chạy các tác vụ một cách thoải mái và để đảm bảo các bộ phận của hệ thống được bảo trì thường xuyên theo ý của người dùng.