Thứ tư, 14/08/2013 | 00:00 GMT+7

Cách lên lịch các công việc thường xuyên với Cron và Anacron trên VPS


Cron là gì?

Cron là một tiện ích lập lịch cho phép bạn chỉ định các việc để chạy vào các thời điểm được cấu hình trước. Một công cụ cơ bản, cron được dùng để tự động hóa hầu hết mọi thứ trên hệ thống của bạn mà phải diễn ra đều đặn.

Không kém phần thành thạo trong việc quản lý các công việc phải được thực hiện hàng giờ hoặc hàng ngày và các thói quen lớn phải được thực hiện một hoặc hai lần một năm, cron là một công cụ cần thiết cho một administrator hệ thống.

Trong hướng dẫn này, ta sẽ thảo luận về cách sử dụng cron từ dòng lệnh và cách đọc file cấu hình của nó. Ta cũng sẽ khám phá anacron, một công cụ được dùng đảm bảo rằng các việc được chạy ngay cả khi server bị tắt một phần thời gian.

Ta sẽ sử dụng VPS Ubuntu 12.04, nhưng bất kỳ bản phân phối Linux hiện đại nào cũng phải hoạt động theo cách tương tự.

Cách hoạt động của Cron

Cron được khởi động khi chạy ở chế độ nền dưới dạng daemon. Điều này nghĩa là nó chạy mà không có sự tương tác của user và đợi các sự kiện nhất định xảy ra để quyết định thời điểm thực thi.

Trong trường hợp của cron, những sự kiện này là những khoảnh khắc nhất định trong thời gian. Cron chạy trong nền và kiểm tra file cấu hình của nó mỗi phút một lần để xem liệu một sự kiện có được lên lịch chạy trong phút đó hay không.

Nếu một sự kiện được lên lịch, cron sẽ thực hiện bất kỳ lệnh định trước nào đã được đưa cho nó và sau đó quay lại chế độ 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 và kiểm tra lại.

Bởi vì lập lịch từng phút này, nó cực kỳ linh hoạt và có thể cấu hình. Sau khi cài đặt bản phân phối của bạn, cron đã được cấu hình để chạy nhiều tác vụ khác nhau.

Làm thế nào để đọc một Crontab

Cron quyết định các lệnh sẽ chạy vào thời điểm nào bằng cách đọc một loạt file , mỗi file được gọi là "crontab". Ta có thể thấy crontab trên toàn hệ thống bằng cách xem "/ etc / crontab":

less /etc/crontab
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à crontab hệ thống và không nên chỉnh sửa trong hầu hết các trường hợp. Hầu hết thời gian tốt hơn là sử dụng crontab của bạn . Tệp hệ thống có thể được thay thế trong một bản cập nhật và các thay đổi sẽ bị mất.

Tệp có một vài phần thú vị mà ta cần hiểu.

Hai dòng đầu tiên chỉ định shell sẽ thực thi các lệnh được liệt kê và đường dẫn để kiểm tra các chương trình.

Phần còn lại của file chỉ định các lệnh thực tế và lập lịch. Mỗi dòng trong danh sách này đại diện cho một bản ghi hoặc hàng trong một bảng. "Tab" trong "crontab" là viết tắt của bảng. Mỗi ô trong bảng được biểu diễn bằng một cột được phân tách bằng dấu cách hoặc tab.

Dòng comment phía trên bảng cung cấp gợi ý về những gì mỗi cột đại diện:

# 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) của giờ mà lệnh sẽ chạy. Cột thứ hai là giờ trong ngày, từ 0-23, mà nó sẽ chạy. Dấu hoa thị (*) nghĩa là "mọi giá trị có thể có" và được dùng làm ký tự đại diện.

Bằng cách kết hợp hai cột đầu tiên này, ta có thể nhận được giá trị thời gian cho lệnh. Ví dụ: dòng thứ hai trong bảng có 25 trong cột phút và 6 trong cột giờ:

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

Điều này nghĩa là tuyến thứ hai nên chạy lúc 6:25 sáng.

Tương tự, dòng đầu tiên nghĩa là lệnh sẽ được chạy mỗi giờ, sau 17 phút trôi qua giờ:

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly

Vì vậy, nó sẽ được chạy lúc 1:17 sáng, 2:17 sáng, 3:17 sáng, v.v.

Lên lịch ngày với Cron

Cột thứ ba, thứ tư và thứ năm xác định những ngày lệnh sẽ được chạy. Cột thứ ba chỉ định một ngày trong tháng, 1-31 (hãy cẩn thận khi lập lịch cho cuối tháng, vì không phải tất cả các tháng đều có cùng số ngày).

Cột thứ tư chỉ định tháng nào, từ 1-12, lệnh sẽ được chạy và cột thứ năm được dành riêng để chỉ định ngày nào trong tuần một lệnh sẽ được chạy, với 0 và 7 đều nghĩa là Chủ nhật. Cái 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 là ký tự đại diện thì lệnh sẽ thực thi nếu một trong hai cột khớp nhau.

Ngày trong tuần và tháng cũng có thể được chỉ định bằng ba chữ cái đầu tiên trong tên của họ. Ta cũng có thể sử dụng các phạm vi có dấu gạch ngang (-) và chọn nhiều giá trị bằng dấu phẩy (,).

Ta cũng có thể chỉ định một khoảng thời gian bằng cách theo sau một giá trị với / và một số. Ví dụ, để thực hiện lệnh cách nhau một giờ, ta có thể đặt "* / 2" trong cột giờ.

Nếu ta nhìn vào crontab, bạn sẽ thấy rằng bản ghi thứ ba được chạy vào Chủ nhật hàng tuần 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 đầu tiên của 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ên 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 tên nếu bạn có yêu cầu đơn giản. Cú pháp cho chúng là "@" theo sau là khoảng được đặt tên.

Ví dụ: ta có thể lên lịch thực thi một thứ gì đó 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 là "@yearly", "@monthly", "@daily" và "@hourly".

Ngoài ra còn có một phím tắt đặc biệt gọi là "@reboot" chạy ngay sau khi cron được khởi động. Điều này thường chỉ xảy ra khi hệ thống khởi động, đó là lý do tại sao nó được gọi là "khởi động lại" thay vì "cron-restart" hoặc một cái gì đó tương tự.

Lưu ý các phím tắt này không cung cấp khả năng kiểm soát chi tiết khi chúng được chạy. Tất cả chúng cũng được cấu hình để chạy vào thời điểm có thể đầu tiên của thời gian khớp.

Ví dụ: "@monthly" sẽ chạy vào nửa đêm của ngày đầu tiên của tháng. Điều này có thể dẫn đến nhiều lệnh được lên lịch chạy cùng một lúc nếu tất cả chúng rơi vào cùng một thời điểm. Bạn không thể lặp lại những sự kiện này như cách bạn có thể làm với cú pháp lập lịch thông thường.

Chỉ định Lệnh và User với Cron

Các cột tiếp theo liên quan đến việc thực hiện thực tế các lệnh được lên lịch.

Cột thứ sáu, chỉ có trong crontab hệ thống mà ta đang xem, đặt tên cho user mà lệnh sẽ được thực thi.

Cột cuối cùng chỉ định lệnh thực sự sẽ được thực thi. Lệnh có thể chứa dấu phần trăm (%), nghĩa là mọi thứ ngoài dấu phần trăm đầu tiên được chuyển tới lệnh dưới dạng đầu vào chuẩn.

Mọi bản ghi cần phải kết thúc bằng một ký tự dòng mới. Đây không phải là vấn đề đối với hầu hết các mục nhập, nhưng hãy đảm bảo bạn có một dòng trống sau mục nhập cuối cùng, nếu không lệnh sẽ không chạy đúng cách.

Sử dụng các bộ phận chạy và Thư mục Cron

Nếu bạn nhìn vào các lệnh được chỉ định trong crontab hệ thống, bạn sẽ thấy đề cập đến "anacron", mà ta sẽ thảo luận sau, và "run-part".

Lệnh run-Parts là một lệnh đơn giản chạy mọi file thực thi nằm trong một folder đượ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 tập lệnh tại một thời điểm xác định bằng cách đặt chúng ở một vị trí duy nhất.

Điều này có lợi thế là cho phép crontab được giữ sạch sẽ và đơn giản, đồng thời cho phép bạn thêm các tập lệnh bổ sung bằng cách chỉ cần đặt chúng vào hoặc liên kết chúng với folder thích hợp thay vì điều chỉnh crontab.

Theo mặc định, hầu hết các bản phân phối đều cài đặt các folder cho mỗi khoảng thời gian, nơi họ đặt các tập lệnh hoặc liên kết đến các tập lệnh mà họ muốn chạy trong repository ảng thời gian đó.

Ví dụ: Ubuntu có các folder có tên "cron.daily", "cron.hourly", "cron.monthly" và "cron.weekly". Bên trong các folder này là các tập lệnh thích hợp.

Sử dụng Crontabs dành riêng cho user

Đến đây bạn đã hiểu cú pháp của cron, bạn có thể sử dụng nó để tạo các việc đã lên lịch cho user của bạn . Ta có thể thực hiện điều này bằng lệnh "crontab".

Bởi vì các lệnh trong crontab của bạn sẽ chạy với quyền user của bạn, cột " user " không tồn tại trong crontab dành riêng cho user .

Để xem crontab hiện tại của bạn, hãy nhập:

crontab -l

Bạn có thể sẽ không có một cái trừ khi bạn đã đặc biệt tạo ra nó bằng tay. Nếu bạn có crontab, tốt nhất là backup bản sao hiện tại trước khi chỉnh sửa để mọi thay đổi bạn thực hiện có thể được hoàn nguyên.

Để lưu trữ bản backup của bạn trong một file có tên "cron.bak" trong folder chính của bạn, hãy chạy:

crontab -l > ~/cron.back

Để chỉnh sửa crontab của bạn, hãy nhập:

crontab -e
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 có thể nhận được một dấu nhắc lựa chọn tương tự như dấu nhắc ở trên trong lần đầu tiên sử dụng lệnh này. Chọn editor bạn muốn tiếp tục.

Bạn sẽ được đưa vào một file đã comment mà bạn có thể chỉnh sửa để tạo luật của riêng mình.

Như một ví dụ vô lý, nếu ta muốn lặp lại ngày tháng vào một file 15 phút một lần vào mỗi Thứ Tư, ta có thể đặt dòng này vào file :

*/15 * * * 3 echo "$(date)" >> /home/demouser/file

Sau đó, ta có thể lưu file và bây giờ, khi ta chạy "crontab -l", ta sẽ thấy luật ta vừa tạo:

crontab -l
. . .
. . .
*/15 * * * 3 echo "$(date)" >> /home/demouser/file

Nếu bạn cần chỉnh sửa crontab của một user cụ thể, bạn cũng có thể thêm tùy chọn "-u tên user ". Bạn sẽ chỉ có thể thực hiện việc này với quyền là user root hoặc với account có quyền quản trị.

Ví dụ: nếu bạn muốn thêm một cái gì đó vào crontab "gốc", bạn có thể đưa ra:

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ó cho rằng server hoặc máy tính của bạn luôn bật. Nếu máy của bạn tắt và bạn có một tác vụ được lên lịch trong thời gian đó, 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ể được đảm bảo là sẽ hoạt động tại bất kỳ thời điểm nào. Do kịch bản này, một công cụ gọi là "anacron" đã được phát triển. Anacron là viết tắt của anachronistic, và nó được sử dụng để bù đắp cho vấn đề này với cron.

Anacron sử dụng các thông số không chi tiết như các tùy chọn của cron. Gia số nhỏ nhất mà anacron hiểu được là ngày. Điều này nghĩa là anacron nên được sử dụng để bổ sung cho cron chứ không phải để thay thế nó.

Ưu điểm của Anacron là nó sử dụng các file được đánh dấu thời gian để tìm ra lần cuối cùng các lệnh của nó được thực thi. Điều này nghĩa là , nếu một tác vụ được lên lịch chạy hàng ngày và máy tính đã bị tắt trong thời gian đó, khi anacron được chạy, nó có thể thấy rằng tác vụ đã được chạy lần cuối hơn 24 giờ trước và thực thi tác vụ một cách chính xác.

Tiện ích anacron có một bảng lập lịch giống như cron. Nó được đặt tên thích hợp là "anacrontab" và cũng nằm trong folder "/ etc". Hãy xem nó được định dạng như thế nào:

less /etc/anacrontab
# /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 nó có định dạng tương tự như các file "crontab", nhưng có ít cột hơn và một số khác biệt đáng chú ý.

Cột đầu tiên chỉ định tần suất chạy lệnh. Nó được cho là một khoảng thời gian tính bằng ngày. Giá trị "1" sẽ chạy mỗi ngày, trong khi giá trị "3" sẽ chạy ba ngày một lần.

Cột thứ hai là độ trễ để sử dụng trước khi thực hiện các lệnh. Anacron không phải là một daemon. Nó được chạy một cách rõ ràng tại một thời điểm. Trường này cho phép bạn thực thi trì trệ để không phải mọi tác vụ đều chạy cùng một lúc.

Ví dụ: dòng đầu tiên chạy mỗi ngày, năm phút sau khi anacron được gọi:

1       5       cron.daily       nice run-parts --report /etc/cron.daily

Dòng sau được chạy hàng tuần (7 ngày một lần), mười 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 như trong các tin nhắn và file log của anacron. Trường thứ tư là lệnh thực được chạy.

Bạn có thể thấy rằng anacron được cài đặt để chạy một số tập lệnh giống nhau được chạy bởi cron. Các bản phân phối xử lý cuộc đụng độ này theo cách khác, bằng cách tạo ưu tiên cho cron hoặc anacron và làm cho chương trình khác không thực thi luật .

Ví dụ: trên Ubuntu, "/ etc / crontab" kiểm tra xem anacron có sẵn trên hệ thống hay không và chỉ thực thi các tập lệnh trong folder cron. * Với cron nếu không tìm thấy anacron.

Các bản phân phối khác có cron cập nhật tem thời gian của anacron mỗi khi nó chạy nội dung của các folder này, để anacron không thực thi khi nó đượ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ách tận dụng điểm mạnh và khắc phục điểm yếu của họ sẽ cho phép bạn sử dụng chúng một cách dễ dàng và hiệu quả.

Mặc dù ban đầu, cú pháp cấu hình có thể khó hiểu, 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 phải điều chỉnh thường xuyên khi bạn đã có một lịch trình làm việc tốt.


Tags:

Các tin liên quan