Cách sử dụng cron để tự động hóa các task trên CentOS 8

centos 8 cron

Cron là một daemon lập lịch công việc dựa trên thời gian, được tìm thấy trong các hệ điều hành kiểu Unix, bao gồm cả các bản phân phối Linux (trong đó có CentOS 8). Cron chạy ngầm trong nền, và các tác vụ được lập lịch với cron, gọi là “cron jobs”, sẽ được thực thi tự động, giúp việc tự động hóa các tác vụ bảo trì trở nên dễ dàng hơn.

Hướng dẫn này cung cấp một cái nhìn tổng quan về cách lập lịch công việc bằng cú pháp đặc biệt của cron. Ngoài ra, nó cũng đề cập đến một vài “phím tắt” giúp bạn dễ dàng viết và hiểu lịch trình công việc.

Điều Kiện Tiên Quyết

Để hoàn thành hướng dẫn này, bạn cần có quyền truy cập vào một máy tính chạy CentOS 8. Điều này có thể là máy tính cá nhân của bạn, một máy ảo, hoặc một máy chủ ảo riêng (VPS).

Dù bạn sử dụng loại máy tính nào để theo dõi hướng dẫn này, máy của bạn nên có một tài khoản không phải root với quyền quản trị được cấu hình sẵn. Để thiết lập điều này, hãy làm theo hướng dẫn “Thiết Lập Máy Chủ Ban Đầu với CentOS ” của DataOnline cho CentOS 8.

Cài Đặt Cron trên CentOS 8

Hầu hết các bản phân phối Linux đều cài sẵn một dạng cron nào đó theo mặc định. Tuy nhiên, nếu bạn đang sử dụng một máy CentOS mà chưa có cron, bạn có thể cài đặt nó bằng cách sử dụng dnf.

Trước khi cài đặt cron trên máy CentOS, hãy cập nhật danh mục gói cục bộ của máy:

sudo dnf update

Sau đó, cài đặt daemon cron với lệnh sau:

sudo dnf install crontabs

Lệnh này sẽ yêu cầu bạn xác nhận rằng bạn muốn cài đặt gói crontabs và các phụ thuộc của nó. Hãy nhấn y rồi ENTER để xác nhận.

Lệnh trên sẽ cài đặt cron trên hệ thống của bạn, nhưng bạn sẽ cần khởi động daemon theo cách thủ công. Bạn cũng cần đảm bảo nó được đặt để chạy mỗi khi máy chủ khởi động. Cả hai thao tác này có thể được thực hiện bằng lệnh systemctl.

Để khởi động daemon cron, chạy lệnh sau:

sudo systemctl start crond.service

Để đặt cron chạy tự động mỗi khi máy chủ khởi động, gõ:

sudo systemctl enable crond.service

Sau đó, cron đã được cài đặt trên hệ thống của bạn và sẵn sàng để bạn bắt đầu lập lịch các công việc.

centos 8 cron job

Hiểu Cách Hoạt Động của Cron

Các cron job được ghi lại và quản lý trong một tệp đặc biệt gọi là crontab. Mỗi tài khoản người dùng trên hệ thống đều có thể có crontab riêng để lập lịch công việc, được lưu tại thư mục /var/spool/cron/.

Để lập lịch một công việc, bạn chỉ cần mở crontab của mình để chỉnh sửa và thêm một tác vụ được viết dưới dạng biểu thức cron. Cú pháp của biểu thức cron có thể được chia thành hai phần: lịch trình và lệnh cần chạy.

Lệnh có thể là bất kỳ lệnh nào bạn thường chạy trên dòng lệnh.

Phần lịch trình của cú pháp được chia thành 5 trường khác nhau, được viết theo thứ tự sau:

Trường Giá trị cho phép
Phút 0-59
Giờ 0-23
Ngày trong tháng 1-31
Tháng 1-12 hoặc JAN-DEC
Ngày trong tuần 0-6 hoặc SUN-SAT

Khi kết hợp, các tác vụ được lập lịch trong crontab có cấu trúc như sau:

minute hour day_of_month month day_of_week command_to_run

Ví dụ, biểu thức cron dưới đây chạy lệnh curl http://www.google.com vào lúc 5:30 chiều mỗi thứ Ba:

30 17 * * 2 curl http://www.google.com

Các Kí Tự Đặc Biệt Trong Lịch Trình

Trong phần lịch trình của biểu thức cron, bạn có thể sử dụng một số kí tự đặc biệt để giúp việc lập lịch dễ dàng hơn:

  • *: Dấu hoa thị trong biểu thức cron là biến đại diện cho “tất cả”. Vì vậy, một công việc được lập lịch với * * * * * sẽ chạy mỗi phút của mỗi giờ của mỗi ngày của mỗi tháng.
  • ,: Dấu phẩy dùng để phân tách các giá trị lập lịch thành danh sách. Nếu bạn muốn một công việc chạy vào đầu và giữa mỗi giờ, thay vì viết hai tác vụ riêng biệt (ví dụ, 0 * * * * và 30 * * * *), bạn có thể đạt được chức năng tương tự với 0,30 * * * *.
  • : Dấu gạch ngang biểu thị một khoảng giá trị trong trường lịch trình. Thay vì có 30 tác vụ riêng biệt cho lệnh muốn chạy trong 30 phút đầu tiên của mỗi giờ (ví dụ: 0 * * * *1 * * * *2 * * * *, …), bạn chỉ cần lập lịch là 0-29 * * * *.
  • /: Dấu gạch chéo kết hợp với dấu hoa thị để thể hiện giá trị bước. Ví dụ, thay vì viết 8 tác vụ riêng biệt để chạy lệnh mỗi 3 giờ (ví dụ: 0 0 * * *0 3 * * *0 6 * * *, …), bạn có thể lập lịch với 0 */3 * * *.

Lưu ý: Bạn không thể sử dụng giá trị bước một cách tùy ý; chỉ có thể dùng các số nguyên chia hết cho phạm vi cho phép của trường đó. Ví dụ, trong trường “giờ” chỉ có thể theo sau dấu gạch chéo bởi 1, 2, 3, 4, 6, 8 hoặc 12.

Một số ví dụ khác về cách sử dụng thành phần lịch trình của cron:

  • * * * * * – Chạy lệnh mỗi phút.
  • 12 * * * * – Chạy lệnh 12 phút sau mỗi giờ.
  • 0,15,30,45 * * * * – Chạy lệnh mỗi 15 phút.
  • */15 * * * * – Chạy lệnh mỗi 15 phút.
  • 0 4 * * * – Chạy lệnh mỗi ngày lúc 4:00 sáng.
  • 0 4 * * 2-4 – Chạy lệnh vào lúc 4:00 sáng mỗi thứ Ba, thứ Tư và thứ Năm.
  • 20,40 */8 * 7-12 * – Chạy lệnh vào phút 20 và 40 của mỗi 8 giờ, mỗi ngày của 6 tháng cuối năm.

Nếu bạn thấy khó hiểu hoặc cần trợ giúp viết lịch cho cron job của riêng bạn, Cronitor cung cấp một công cụ biên tập biểu thức lịch trình có tên “Crontab Guru” để kiểm tra tính hợp lệ của lịch trình.

Quản Lý Crontab trên CentOS 8

Khi bạn đã xác định được lịch trình và biết tác vụ cần chạy, bạn sẽ cần đưa nó vào nơi daemon có thể đọc được.

Như đã đề cập, crontab là tệp đặc biệt chứa lịch trình các tác vụ mà cron sẽ chạy. Tuy nhiên, các tệp này không được chỉnh sửa trực tiếp. Thay vào đó, nên sử dụng lệnh crontab. Lệnh này cho phép bạn chỉnh sửa crontab của tài khoản mà không cần sử dụng sudo, đồng thời sẽ thông báo nếu có lỗi cú pháp (trong khi chỉnh sửa trực tiếp sẽ không).

Để chỉnh sửa crontab của bạn, sử dụng lệnh:

crontab -e

Lệnh này sẽ mở crontab của tài khoản của bạn trong trình soạn thảo văn bản mặc định.

Lưu ý: Trên các máy chủ CentOS 8 mới, lệnh crontab -e sẽ mở crontab của bạn với vi theo mặc định. vi là một trình soạn thảo mạnh mẽ nhưng có thể hơi khó sử dụng đối với người mới.

Nếu bạn muốn sử dụng một trình soạn thảo thân thiện hơn, bạn có thể cài đặt và cấu hình nano.

Để cài đặt nano bằng dnf, gõ:

sudo dnf install nano

Khi được hỏi, nhấn y rồi ENTER để xác nhận cài đặt.

Để đặt nano làm trình soạn thảo mặc định cho crontab, mở tệp .bash_profile để chỉnh sửa:

nano ~/.bash_profile

Thêm dòng sau vào cuối tệp:

~/.bash_profile

. . .
export VISUAL="nano"

Lưu tệp và thoát (nhấn CTRL + X, sau đó Y và ENTER).

Sau đó, tải lại .bash_profile để shell nhận thay đổi:

bash
. ~/.bash_profile

Copy

Khi đã vào trình soạn thảo, bạn có thể nhập lịch trình cho mỗi công việc trên một dòng mới. Nếu bạn mở crontab bằng vi, hãy nhấn ESC, gõ :x và nhấn ENTER để lưu và thoát.

Lưu ý rằng, trên hệ thống Linux, còn tồn tại một crontab hệ thống lưu tại thư mục /etc/. Tệp này có thêm một trường chỉ định người dùng để chạy mỗi cron job. Hướng dẫn này tập trung vào crontab riêng của người dùng; nếu bạn muốn chỉnh sửa crontab hệ thống, bạn có thể dùng:

sudo nano /etc/crontab

Nếu bạn chỉ muốn xem nội dung của crontab mà không chỉnh sửa, sử dụng lệnh:

crontab -l

Để xóa crontab của bạn, sử dụng lệnh:

Cảnh báo: Lệnh sau sẽ không hỏi xác nhận. Chỉ chạy nếu bạn chắc chắn muốn xóa crontab.

crontab -r

Bạn cũng có thể thêm tham số -i để được hỏi xác nhận:

crontab -r -i

Output

crontab: really delete sammy's crontab?

Khi được hỏi, nhập y để xóa hoặc n để hủy.

Quản Lý Output của Cron Job

Vì cron job được thực thi trong nền, không phải lúc nào cũng rõ ràng rằng chúng đã chạy thành công. Khi bạn đã biết cách sử dụng lệnh crontab và lập lịch cron job, bạn có thể thử nghiệm một số cách chuyển hướng output của cron job để kiểm tra chúng đã được thực thi hay chưa.

Nếu máy chủ của bạn có cài đặt một MTA (Mail Transfer Agent) như Sendmail và được cấu hình đúng, bạn có thể gửi output của cron job tới địa chỉ email liên kết với tài khoản Linux của bạn. Bạn cũng có thể chỉ định email cụ thể bằng cách cung cấp biến MAILTO ở đầu crontab.

Ví dụ, bạn có thể thêm các dòng sau vào crontab:

. . .

MAILTO="example@digitalocean.com"
SHELL=/bin/bash
HOME=/

* * * * * echo ‘Run this command every minute’

Công việc trên sẽ in ra “Chạy lệnh này mỗi phút”, và output đó sẽ được gửi qua email mỗi phút tới địa chỉ được chỉ định sau biến MAILTO.

Bạn cũng có thể chuyển hướng output của cron job vào file log hoặc một vị trí đặc biệt để tránh nhận email.

Để thêm output của lệnh vào file log, hãy thêm >> theo sau lệnh và tên file log, ví dụ:

* * * * * echo ‘Run this command every minute’ >> /directory/path/file.log

Giả sử bạn muốn chạy một script nhưng vẫn giữ nó chạy nền, bạn có thể chuyển hướng output của script đến /dev/null (một nơi mà mọi dữ liệu được ghi vào sẽ bị xóa ngay lập tức). Ví dụ, cron job sau đây sẽ chạy một script PHP và chạy nó nền:

* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1

Lệnh này cũng chuyển hướng lỗi chuẩn (đại diện bởi 2) sang output chuẩn (>&1). Vì output chuẩn đã được chuyển hướng đến /dev/null, điều này cho phép script chạy một cách im lặng. Ngay cả khi crontab có chứa biến MAILTO, output của lệnh sẽ không được gửi qua email.

Hạn Chế Quyền Truy Cập

Bạn có thể quản lý những người dùng được phép sử dụng lệnh crontab bằng cách sử dụng các tệp cron.allow và cron.deny, cả hai đều được lưu trong thư mục /etc/. Nếu tệp cron.deny tồn tại, bất kỳ người dùng nào có tên trong đó sẽ bị cấm chỉnh sửa crontab của họ. Nếu cron.allow tồn tại, chỉ những người dùng có tên trong đó mới được phép chỉnh sửa crontab. Nếu cả hai tệp tồn tại và cùng chứa một người dùng, tệp cron.allow sẽ ghi đè và người dùng đó sẽ được phép chỉnh sửa crontab.

Ví dụ, để cấm truy cập cho tất cả người dùng và sau đó cho phép truy cập cho người dùng ishmael, bạn có thể sử dụng chuỗi lệnh sau:

sudo echo ALL >>/etc/cron.deny
sudo echo ishmael >>/etc/cron.allow

Đầu tiên, chúng ta khóa tất cả người dùng bằng cách thêm “ALL” vào tệp cron.deny. Sau đó, bằng cách thêm tên người dùng vào tệp cron.allow, chúng ta cho phép người dùng ishmael truy cập crontab.

Lưu ý: Nếu một người dùng có quyền sudo, họ có thể chỉnh sửa crontab của người dùng khác với lệnh:

sudo crontab -u user -e

Tuy nhiên, nếu tệp cron.deny tồn tại và người dùng đó có tên trong đó mà không có trong cron.allow, bạn sẽ nhận được lỗi sau khi chạy lệnh trên:

Output

The user user cannot use this program (crontab)

Theo mặc định, hầu hết các daemon cron sẽ cho rằng mọi người dùng đều có quyền truy cập vào cron trừ khi có tệp cron.allow hoặc cron.deny tồn tại.

Cú Pháp Đặc Biệt

Ngoài ra, còn có một số lệnh tắt mà bạn có thể sử dụng trong tệp crontab để đơn giản hóa việc lập lịch. Chúng về cơ bản là các phím tắt cho lịch trình số tương đương:

Phím Tắt Tương Đương với Lịch Trình
@hourly 0 * * * *
@daily 0 0 * * *
@weekly 0 0 * * 0
@monthly 0 0 1 * *
@yearly 0 0 1 1 *

Lưu ý: Không phải tất cả các daemon cron đều có thể hiểu được cú pháp này (đặc biệt là các phiên bản cũ hơn), vì vậy hãy kiểm tra trước khi dựa vào nó.

Ngoài ra, phím tắt @reboot sẽ chạy lệnh theo sau nó bất cứ khi nào máy chủ khởi động:

@reboot echo "System start up"

Sử dụng các phím tắt này khi có thể sẽ giúp bạn dễ dàng giải thích lịch trình của các tác vụ trong crontab.

Kết Luận

Cron là một tiện ích linh hoạt và mạnh mẽ có thể giảm bớt gánh nặng của nhiều tác vụ quản trị hệ thống. Khi kết hợp với các script shell, bạn có thể tự động hóa những công việc thường ngày mà bình thường rất tẻ nhạt hoặc phức tạp.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *