Cron là gì?
Cron là một tiện ích lập lịch cho phép bạn giao nhiệm vụ chạy tại các thời điểm đã được cấu hình sẵn. Đây là một công cụ cơ bản, cron có thể được sử dụng để tự động hóa hầu như mọi thứ trên hệ thống của bạn mà cần thực hiện theo các khoảng thời gian định kỳ.
Với khả năng quản lý các tác vụ cần thực hiện hàng giờ hoặc hàng ngày cũng như các quy trình lớn chỉ cần chạy một hoặc hai lần trong năm, cron là công cụ thiết yếu đối với quản trị viên hệ thống.
Trong hướng dẫn này, chúng ta sẽ thảo luận cách sử dụng cron từ dòng lệnh và cách đọc tệp cấu hình của nó. Chúng ta cũng sẽ khám phá anacron, một công cụ có thể được sử dụng để đảm bảo rằng các tác vụ được chạy ngay cả khi máy chủ bị tắt một phần thời gian.
Để tự động hóa tác vụ trên VPS, sử dụng Cron và Anacron là giải pháp tối ưu. Nếu bạn đang tìm kiếm dịch vụ VPS Việt Nam chất lượng, DataOnline cung cấp VPS tốc độ cao, ổn định, hỗ trợ 24/7, giúp quản lý công việc hiệu quả hơn. Khám phá ngay
Chúng ta sẽ sử dụng một VPS chạy Ubuntu 12.04, nhưng bất kỳ bản phân phối Linux hiện đại nào cũng sẽ hoạt động tương tự.
Cách cron hoạt động
Cron được khởi chạy khi hệ thống khởi động và chạy ở chế độ nền như một daemon. Điều này có nghĩa là nó chạy mà không cần sự tương tác của người dùng và chờ đợi các sự kiện nhất định xảy ra để quyết định khi nào thực hiện lệnh.
Trong trường hợp của cron, các sự kiện đó chính là những khoảnh khắc cụ thể trong thời gian. Cron chạy nền và kiểm tra tệp cấu hình của nó mỗi phút một lần để xem có sự kiện nào được lên lịch chạy trong phút đó hay không.
Nếu có sự kiện được lên lịch, cron sẽ thực thi lệnh đã được chỉ định trước và sau đó quay lại chạy nền trong một phút nữa. Nếu không có sự kiện nào được lên lịch, nó sẽ đợi 60 giây rồi kiểm tra lại.
Với cơ chế lập lịch theo từng phút như vậy, cron cực kỳ linh hoạt và có thể cấu hình chi tiết. Ngay sau khi cài đặt bản phân phối của bạn, cron đã được cấu hình sẵn để chạy một loạt các tác vụ.
Cách đọc tệp crontab
Cron quyết định chạy các lệnh nào vào thời gian nào bằng cách đọc một loạt các tệp, mỗi tệp được gọi là “crontab”. Chúng ta có thể xem crontab hệ thống bằng cách mở tệp “/etc/crontab”:
less /etc/crontab
Nội dung tệp có thể giống như sau:
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
Đây là tệp crontab hệ thống và hầu như không nên chỉnh sửa. Phần lớn thời gian, tốt hơn bạn nên sử dụng crontab cá nhân của mình. Tệp hệ thống có thể bị ghi đè khi cập nhật và các thay đổi của bạn sẽ bị mất.
Tệp trên có một vài phần quan trọng mà chúng ta cần hiểu.
- Hai dòng đầu tiên xác định shell sẽ thực thi các lệnh liệt kê và đường dẫn tìm kiếm các chương trình.
- Phần còn lại của tệp xác định các lệnh thực thi và lịch chạy. Mỗi dòng trong danh sách này đại diện cho một bản ghi (hoặc một hàng) trong bảng. “Crontab” được đặt tên như vậy vì nó là viết tắt của “table”. Mỗi ô trong bảng được đại diện bởi một cột, được phân cách bằng khoảng trắng hoặc tab.
Dòng chú thích phía trên bảng cung cấp gợi ý về các cột đại diện cho:
# m h dom mon dow user command
Lập lịch giờ và phút với cron
- Cột đầu tiên là phút (0-59) trong giờ mà lệnh nên chạy.
- Cột thứ hai là giờ trong ngày (0-23) mà lệnh nên chạy. Dấu hoa thị (*) có nghĩa là “mỗi giá trị có thể”, và được sử dụng như một ký tự đại diện.
Bằng cách kết hợp hai cột đầu tiên này, ta có thể xác định được thời gian chạy cho lệnh. Ví dụ, dòng thứ hai trong bảng có giá trị 25 ở cột phút và 6 ở cột giờ:
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
Điều này có nghĩa là dòng thứ hai sẽ được chạy vào lúc 6:25 sáng.
Tương tự, dòng đầu tiên có nghĩa là lệnh sẽ được chạy vào mỗi giờ, đúng 17 phút sau giờ bắt đầu:
17 * * * * root cd / && run-parts --report /etc/cron.hourly
Vậy nên, nó sẽ chạy vào lúc 1:17, 2:17, 3:17, v.v.
Lập lịch theo ngày với cron
Cột thứ ba, thứ tư và thứ năm xác định những ngày mà lệnh sẽ được chạy. Cột thứ ba chỉ định một ngày trong tháng, từ 1 đến 31 (hãy cẩn thận khi lên lịch cho cuối tháng, vì không phải tháng nào cũng có cùng số ngày).
Cột thứ tư chỉ định những tháng (từ 1 đến 12) mà lệnh nên chạy, và cột thứ năm dành để chỉ định ngày trong tuần mà lệnh sẽ chạy, trong đó 0 và 7 đều có nghĩa là Chủ nhật. Cột cuối cùng này cho phép bạn lên lịch theo tuần thay vì theo tháng.
Nếu cả cột ngày trong tuần và ngày trong tháng đều có giá trị không phải ký tự đại diện, thì lệnh sẽ được thực thi nếu một trong hai cột khớp.
Ngày trong tuần và tháng cũng có thể được chỉ định bằng ba chữ cái đầu tiên của tên chúng. Chúng ta cũng có thể sử dụng khoảng bằng dấu gạch ngang (-) và chọn nhiều giá trị bằng dấu phẩy (,).
Chúng ta cũng có thể chỉ định khoảng thời gian bằng cách theo sau một giá trị với dấu “/” và một số. Ví dụ, để thực thi lệnh mỗi 2 giờ một lần, chúng ta có thể đặt “*/2” vào cột giờ.
Nếu ta xem tệp crontab, bạn sẽ thấy bản ghi thứ ba được chạy vào mỗi Chủ nhật lúc 6:47 sáng.
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
Bản ghi thứ tư được chạy vào ngày mồng 1 của mỗi tháng lúc 6:52 sáng:
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
Sử dụng phím tắt thời gian để lập lịch
Bạn có thể thay thế năm cột đầu tiên của mỗi bản ghi bằng một phím tắt có tên nếu yêu cầu của bạn đơn giản. Cú pháp của các phím tắt này là “@” theo sau là khoảng thời gian đã đặt tên.
Ví dụ, chúng ta có thể lập lịch một tác vụ chạy hàng tuần bằng cách chỉ định “@weekly” thay vì tạo cấu hình năm cột. Các lựa chọn khác gồm có “@yearly”, “@monthly”, “@daily” và “@hourly”.
Ngoài ra, còn có một phím tắt đặc biệt là “@reboot” chạy ngay khi cron được khởi động. Điều này thường xảy ra khi hệ thống khởi động, đó là lý do nó được gọi là “reboot” thay vì “cron-restart” hay tương tự.
Hãy lưu ý rằng các phím tắt này không cho phép kiểm soát chi tiết thời gian chạy. Tất cả đều được cấu hình để chạy vào thời điểm đầu tiên có thể của khoảng thời gian tương ứng. Ví dụ, “@monthly” sẽ chạy vào đúng nửa đêm ngày mồng 1 của tháng. Điều này có thể dẫn đến việc nhiều lệnh được lên lịch chạy cùng lúc nếu chúng trùng thời gian. Bạn sẽ không thể phân tán các sự kiện như khi sử dụng cú pháp lập lịch truyền thống.
Chỉ định lệnh và người dùng với cron
Các cột tiếp theo liên quan đến việc thực thi các lệnh được lên lịch.
- Cột thứ sáu (chỉ có trong crontab hệ thống) xác định tên người dùng mà lệnh sẽ được thực thi.
- Cột cuối cùng chỉ định lệnh thực tế cần được chạy. Lệnh có thể chứa dấu phần trăm (%) – có nghĩa là mọi thứ sau dấu phần trăm đầu tiên sẽ được chuyển cho lệnh dưới dạng đầu vào tiêu chuẩn.
Mỗi bản ghi cần kết thúc bằng ký tự xuống dòng. Điều này thường không thành vấn đề với hầu hết các mục, nhưng hãy chắc chắn rằng bạn có một dòng trống sau bản ghi cuối cùng, nếu không lệnh sẽ không chạy đúng.
Sử dụng run-parts và thư mục cron
Nếu bạn quan sát các lệnh được chỉ định trong crontab hệ thống, bạn sẽ thấy đề cập đến “anacron” (chúng ta sẽ bàn về nó sau) và “run-parts”.
Lệnh run-parts là một lệnh đơn giản chạy tất cả các tệp thực thi nằm trong một thư mục chỉ định. Nó được sử dụng rộng rãi với cron vì nó cho phép bạn chạy nhiều script vào một thời điểm xác định bằng cách chỉ cần đặt chúng vào một vị trí duy nhất.
Ưu điểm của cách này là giúp crontab được giữ gọn gàng và đơn giản, đồng thời bạn có thể thêm các script bổ sung chỉ bằng cách đặt hoặc liên kết chúng vào thư mục thích hợp mà không cần phải chỉnh sửa crontab.
Theo mặc định, hầu hết các bản phân phối sẽ thiết lập các thư mục cho mỗi khoảng thời gian, trong đó chứa các script hoặc liên kết tới các script mà họ muốn chạy vào khoảng thời gian đó.
Ví dụ, Ubuntu có các thư mục tên là cron.daily, cron.hourly, cron.monthly và cron.weekly. Bên trong các thư mục này là các script tương ứng.
Sử dụng crontab riêng cho người dùng
Khi bạn đã hiểu cú pháp của cron, bạn có thể sử dụng nó để tạo các tác vụ được lên lịch cho chính người dùng của bạn. Việc này có thể được thực hiện với lệnh crontab.
Vì các lệnh trong crontab của bạn sẽ chạy với quyền của người dùng đó, cột “user” sẽ không xuất hiện trong crontab cá nhân.
Để xem crontab hiện tại của bạn, gõ:
crontab -l
Có thể bạn chưa có crontab nào trừ khi bạn đã tạo nó bằng tay. Nếu có, tốt nhất bạn nên sao lưu bản hiện tại trước khi chỉnh sửa để có thể khôi phục lại nếu cần.
Để lưu bản sao lưu vào tệp có tên “cron.back” trong thư mục chính, hãy chạy:
crontab -l > ~/cron.back
Để chỉnh sửa crontab của bạn, gõ:
crontab -e
Khi lần đầu sử dụng lệnh này, bạn có thể thấy thông báo như:
no crontab for demouser - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny
Bạn sẽ được chọn trình soạn thảo ưa thích để tiếp tục.
Sau đó, bạn sẽ được đưa vào một tệp có sẵn các dòng chú thích mà bạn có thể chỉnh sửa để tạo các quy tắc của riêng mình.
Ví dụ, nếu bạn muốn ghi ngày vào một tệp mỗi 15 phút vào thứ Tư, bạn có thể thêm dòng sau vào tệp:
*/15 * * * 3 echo "$(date)" >> /home/demouser/file
Sau khi lưu tệp, khi chạy lệnh:
crontab -l
Bạn sẽ thấy quy tắc vừa tạo:
. . . . . . */15 * * * 3 echo "$(date)" >> /home/demouser/file
Nếu bạn cần chỉnh sửa crontab của một người dùng cụ thể, bạn cũng có thể thêm tùy chọn “-u username”. Tuy nhiên, thao tác này chỉ có thể thực hiện với quyền root hoặc tài khoản có quyền quản trị. Ví dụ, nếu bạn muốn thêm tác vụ vào crontab của “root”, bạn có thể chạy:
sudo crontab -u root -e
Sử dụng Anacron với Cron
Một trong những điểm yếu lớn nhất của cron là nó giả định rằng máy chủ hoặc máy tính của bạn luôn bật. Nếu máy của bạn bị tắt khi có tác vụ được lên lịch, tác vụ đó sẽ không bao giờ chạy.
Đây là một vấn đề nghiêm trọng với các hệ thống không thể đảm bảo luôn bật. Do đó, một công cụ có tên anacron đã được phát triển. Anacron, viết tắt của anachronistic, được sử dụng để bù đắp cho vấn đề này trong cron.
Anacron sử dụng các tham số không chi tiết bằng các tùy chọn của cron. Khoảng thời gian nhỏ nhất mà anacron hiểu là ngày. Điều này có nghĩa là anacron nên được dùng bổ sung cho cron chứ không thay thế nó.
Ưu điểm của anacron là nó sử dụng các tệp có dấu thời gian để xác định lần cuối các lệnh của nó được thực thi. Nghĩa là, nếu một tác vụ được lên lịch chạy hàng ngày nhưng máy tính bị tắt trong khoảng thời gian đó, khi anacron chạy, nó có thể nhận thấy rằng tác vụ đã được chạy hơn 24 giờ trước và thực thi lệnh chính xác.
Tiện ích anacron có một bảng lập lịch tương tự như cron. Tệp cấu hình của nó có tên là anacrontab và được đặt trong thư mục /etc. Hãy cùng xem cấu trúc của nó:
less /etc/anacrontab
Nội dung có thể như sau:
# /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # These replace cron's entries 1 5 cron.daily nice run-parts --report /etc/cron.daily 7 10 cron.weekly nice run-parts --report /etc/cron.weekly @monthly 15 cron.monthly nice run-parts --report /etc/cron.monthly
Ta có thể thấy rằng cấu trúc tương tự như tệp crontab, nhưng có ít cột hơn và có một vài điểm khác biệt rõ rệt.
- Cột đầu tiên chỉ định khoảng cách (theo số ngày) mà lệnh nên được chạy. Giá trị “1” có nghĩa là chạy hàng ngày, trong khi “3” nghĩa là chạy mỗi ba ngày.
- Cột thứ hai là khoảng trễ trước khi thực thi các lệnh. Anacron không chạy như một daemon; nó được gọi chạy theo cách tường minh. Trường này cho phép bạn phân tán thời gian thực thi để không phải tất cả các tác vụ đều chạy cùng lúc.
Ví dụ, dòng đầu tiên chạy hàng ngày, 5 phút sau khi anacron được gọi:
1 5 cron.daily nice run-parts --report /etc/cron.daily
Dòng tiếp theo chạy hàng tuần (mỗi 7 ngày), 10 phút sau khi anacron được gọi:
7 10 cron.weekly nice run-parts --report /etc/cron.weekly
- Cột thứ ba chứa tên mà công việc sẽ được biết đến trong các thông báo và tệp log của anacron.
- Cột thứ tư là lệnh thực tế được chạy.
Bạn có thể thấy rằng anacron được cấu hình để chạy một số script giống như cron. Các bản phân phối xử lý sự trùng lặp này khác nhau, bằng cách ưu tiên cron hoặc anacron và làm cho chương trình còn lại không thực thi quy tắc đó.
Ví dụ, trên Ubuntu, tệp /etc/crontab sẽ kiểm tra xem anacron có khả dụng trên hệ thống hay không và chỉ thực thi các script trong các thư mục cron.* bằng cron nếu không tìm thấy anacron. Các bản phân phối khác có thể để cron cập nhật dấu thời gian của anacron mỗi khi chạy nội dung của các thư mục này, để anacron không chạy khi được gọi.
Kết luận
Cả cron và anacron đều là những công cụ hữu ích khi bạn cần tự động hóa các quy trình. Hiểu được cách tận dụng điểm mạnh và khắc phục điểm yếu của chúng sẽ giúp bạn sử dụng chúng một cách dễ dàng và hiệu quả.
Anacron đảm bảo các tác vụ không bị bỏ lỡ ngay cả khi VPS tắt. Để trải nghiệm quản lý tác vụ mượt mà, hãy thuê máy chủ VPS tại DataOnline với công nghệ NVMe Gen 5, giá rẻ, hiệu suất cao. Tìm hiểu thêm để tối ưu hóa hệ thống của bạn
Mặc dù cú pháp cài đặt ban đầu có thể gây bối rối, nhưng những công cụ này sẽ giúp bạn tiết kiệm thời gian về lâu dài và thường không cần điều chỉnh quá thường xuyên khi bạn đã có một lịch trình hoạt động tốt.