Chủ Nhật, 27/09/2020 | 12:05 GMT+7

Lập lịch với Crontab trên Centos 8

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ụ liên quan đến quản trị hệ thống. Khi được kết hợp với các tập lệnh shell, ta có thể tự động hóa các tác vụ thường lặp lại tẻ nhạt hay phức tạp. 

Giới thiệu

Cron là một daemon lập lịch công việc theo thời gian ở các hệ điều hành họ Unix, gồm cả các bản phân phối Linux. Cron chạy nền (background). Các tác vụ được lập lịch với cron, được gọi là “cron job”, được thực thi tự động, cron dùng để tự động hóa các tác vụ.

Hướng dẫn này cung cấp tổng quan về cách lập lịch bằng cú pháp của cron, và chỉ ra một số phím tắt mà người ta có thể sử dụng để làm cho lịch trình công việc dễ viết và dễ hiểu hơn.

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần quyền truy cập vào một máy CentOS 8. Có thể tham khảo hướng dẫn Thiết lập Máy chủ Ban đầu  cho CentOS 8 .

Cài đặt Cron

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

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

  • sudo dnf update

Sau đó cài đặt trình cron bằng lệnh:

  • sudo dnf install crontabs

Lệnh này sẽ nhắc bạn xác nhận rằng bạn muốn cài đặt gói crontabs và các file đi kèm.

Thao tác này sẽ cài đặt cron trên hệ thống, bạn sẽ cần khởi động daemon theo cách thủ công. Bạn cần đảm bảo rằng nó được thiết lập để chạy bất cứ khi nào máy chủ khởi động, có thể thực hiện cả hai thao tác này bằng lệnh systemctl .

Để khởi động trình cron, hãy chạy lệnh sau:

  • sudo systemctl start crond.service

Để đặt cron khi máy khởi động, hãy nhập:

  • sudo systemctl enable crond.service

Vậy cron đã được cài đặt trên hệ thống và sẵn sàng để lên lịch các tác vụ.

Hiểu cách hoạt động của Cron

Các công việc cron được ghi lại và quản lý trong một file gọi là crontab . Mỗi profile người dùng trên hệ thống có thể có crontab của riêng, nơi user đó có thể lên lịch công việc, được lưu trữ trong /var/spool/cron/ .

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

Lệnh có thể là bất kỳ lệnh nào chạy trên dòng lệnh. Thành phần lịch được chia thành 5 trường khác nhau, được viết theo thứ tự sau:

Field Giá trị
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

Kết hợp lại, tác vụ được lên 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ụ chạy lệnh curl http://www.google.com vào lúc 5:30 chiều Thứ Ba hàng tuần:

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

Ngoài ra có một số ký tự đặc biệt mà bạn có thể đưa vào thành phần lịch cron làm cho việc lập lịch biểu dễ dàng hơn:

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

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

Dưới đây là một số ví dụ khác:

  • * * * * * - 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 sau mỗi 15 phút.
  • */15 * * * * - Chạy lệnh sau mỗi 15 phút.
  • 0 4 * * * - Chạy lệnh hàng ngày lúc 4:00 sáng.
  • 0 4 * * 2-4 - Chạy lệnh vào lúc 4:00 sáng Thứ Ba, Thứ Tư và Thứ Năm hàng tuần.
  • 20,40 */8 * 7-12 * - Chạy lệnh vào phút thứ 20 và 40 của giờ thứ 8 hàng ngày trong 6 tháng cuối năm.

Nếu bạn thấy khó hiểu hoặc muốn giúp viết cron của riêng mình, Cronitor cung cấp một trình soạn thảo cron tiện dụng có tên “Crontab Guru” và bạn có thể sử dụng để kiểm tra xem cron có hợp lệ hay không.

Quản lý Crontabs

Như đã đề cập, crontab là một file chứa lịch trình của các công việc mà cron sẽ chạy. Tuy nhiên không nên sửa trực tiếp file đó (ví dụ với lệnh soạn thảo Vi). Bạn nên sử dụng lệnh crontab để edit nó. Điều này cho phép bạn chỉnh sửa crontab mà không thay đổi các đặc quyền với sudo . Lệnh crontab cũng sẽ cho bạn biết lỗi cú pháp trong crontab, khi chỉnh sửa trực tiếp với các editor khác thì không có điều này.

Chỉnh sửa crontab bằng lệnh sau:

  • crontab -e

Sẽ mở crontab trong trình soạn thảo văn bản mặc định. 

Lưu ý : Trên CentOS 8 mới, lệnh crontab -e sẽ mở crontab của người dùng với vi theo mặc định. vi là một trình soạn thảo văn bản cực kỳ mạnh mẽ và linh hoạt, nhưng có thể khó hiểu đối với những người dùng chưa kinh nghiệm với nó.

Gợi ý trình soạn thảo văn bản dễ tiếp cận hơn đó là nano.

Cài đặt nano với dnf :

  • sudo dnf install nano

Để đặt nano làm trình editor mặc định của người dùng, hãy mở file .bash_profile để chỉnh sửa:

  • nano ~/.bash_profile

Ở cuối file, thêm dòng sau:

~ / .bash_profile
. . .
export VISUAL="nano"

Điều này đặt biến môi trường VISUAL thành nano . VISUAL là một biến môi trường Unix mà nhiều chương trình - bao gồm crontab - gọi ra để chỉnh sửa file. Sau khi thêm dòng này, hãy lưu và đóng file bằng cách nhấn CTRL + X , Y , sau đó ENTER .

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

  • . ~/.bash_profile

Trong trình chỉnh sửa, bạn có thể nhập lịch trình với từng công việc trên một dòng mới. Nếu không, bạn có thể lưu và đóng crontab. Nếu bạn mở crontab bằng vi , trình soạn thảo văn bản mặc định của CentOS 8, có thể làm như vậy bằng cách nhấn ESC để đảm bảo rằng bạn đang ở chế độ lệnh của vi , sau đó nhập :x và nhấn ENTER .

Xin lưu ý rằng, trên các hệ thống Linux, có một crontab khác được lưu trữ trong thư mục /etc/ . Đây là một crontab toàn hệ thống có một trường bổ sung mà profile người dùng mà mỗi công việc cron sẽ được chạy. Hướng dẫn này tập trung vào crontab dành riêng cho người dùng, nhưng nếu bạn muốn chỉnh sửa crontab trên toàn hệ thống, bạn có thể làm như vậy bằng lệnh sau:

  • sudo nano /etc/crontab

Nếu muốn xem nội dung crontab , nhưng không chỉnh sửa, bạn có thể sử dụng lệnh sau:

  • crontab -l

Bạn có thể xóa crontab bằng lệnh sau:

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

  • crontab -r

Lệnh trên sẽ xóa crontab của người dùng ngay lập tức. Bạn có thể bao gồm cờ -i để có dấu nhắc lệnh xác nhận rằng bạn thực sự muốn xóa crontab của người dùng:

  • crontab -r -i
Output
crontab: really delete sammy's crontab?

Nhập y để xóa crontab hoặc n để hủy.

Quản lý kết quả Cron

Các công việc cron được thực thi ở chế độ nền, không phải lúc nào cũng chắc chắn chúng đã chạy thành công. Bạn đã biết cách sử dụng lệnh crontab và cách lên lịch công việc cron, bạn có thể bắt đầu thử nghiệm một số cách khác nhau để chuyển hướng đầu ra của công việc cron để giúp bạn theo dõi xem chúng đã được thực thi thành công hay chưa.

Nếu có một MailAgent như Sendmail - được cài đặt và định cấu hình đúng cách trên máy chủ, bạn có thể gửi kết quả của các tác vụ cron tới địa chỉ email được liên kết với profile người dùng Linux của bạn. Bạn cũng có thể chỉ định địa chỉ email theo cách thủ công bằng cách cung cấp cài đặt MAILTO ở đầu lệnh crontab.

Ví dụ, bạn có thể thêm các dòng sau vào crontab, gồm một câu lệnh MAILTO theo sau là một địa chỉ email mẫu, một lệnh SHELL cho biết shell để chạy ( bash trong ví dụ này), một lệnh HOME trỏ đến đường dẫn để tìm kiếm nhị phân cron và một tác vụ cron:

. . .

MAILTO="example@galaxycloud.vn"
SHELL=/bin/bash
HOME=/

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

Việc này sẽ trả về “Chạy lệnh này mỗi phút” và kết quả đó sẽ được gửi qua email mỗi phút đến địa chỉ email được chỉ định sau lệnh MAILTO .

Bạn cũng có thể chuyển hướng đầu ra của tác vụ cron thành file nhật ký hoặc vào một vị trí trống, để tránh nhận được email cùng với đầu ra.

Để nối đầu ra của lệnh đã lên lịch vào file nhật ký, hãy thêm >> vào cuối lệnh, sau đó là tên và vị trí của file nhật ký mà bạn chọn, như sau:

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

Giả sử bạn muốn sử dụng cron để chạy một tập lệnh nhưng giữ cho nó chạy trong nền. Để làm như vậy, bạn có thể chuyển hướng đầu ra của tập lệnh đến một vị trí trống, như /dev/null , ngay lập tức xóa bất kỳ dữ liệu nào được ghi vào đó. Ví dụ: lệnh cron sau đây thực thi một tập lệnh PHP và chạy nó trong nền:

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

Công việc cron này cũng chuyển hướng lỗi mặc định - được biểu thị bằng 2 - đến đầu ra chuẩn ( >&1 ). Bởi vì đầu ra chuẩn đã được chuyển hướng đến /dev/null , điều này về cơ bản cho phép tập lệnh chạy ẩn nền. Ngay cả khi crontab chứa câu lệnh MAILTO , đầu ra của lệnh sẽ không được gửi đến địa chỉ email được chỉ định.

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 với các file cron.allowcron.deny , cả hai file này đều được lưu trữ trong thư mục /etc/ . Nếu file cron.deny tồn tại, bất kỳ người dùng nào được liệt kê 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 liệt kê trong đó mới có thể chỉnh sửa crontabs của họ. Nếu cả hai file đều tồn tại và cùng một người dùng được liệt kê trong mỗi file, file cron.allow sẽ ghi đè cron.deny và người dùng sẽ có thể chỉnh sửa crontab của họ.

Ví dụ: để từ chối quyền truy cập cho tất cả người dùng và sau đó cấp quyền truy cập cho ishmael người dùng, 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, ta khóa tất cả người dùng bằng cách thêm ALL vào file cron.deny . Sau đó, bằng cách thêm tên người dùng vào file cron.allow , ta cấp quyền truy cập profile người dùng ishmael để thực thi các công việc cron.

Lưu ý rằng nếu người dùng có đặc quyền sudo , họ có thể chỉnh sửa crontab của người dùng khác bằng lệnh sau:

  • sudo crontab -u user -e

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

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 tất cả người dùng đều có quyền truy cập vào cron trừ khi cron.allow hoặc cron.deny tồn tại.

Cú pháp đặc biệt

Ngoài ra còn một số lệnh nhanh mà bạn có thể sử dụng trong crontab để giúp sắp xếp lịch trình:

Text Viết tắt cho
@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ể phân tích 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 kỹ nó hoạt động trước khi chạy.

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

@reboot echo "System start up"

Sử dụng các lệnh trên giúp diễn giải lịch trình của các tác vụ crontab dễ dàng hơn.

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ụ liên quan đến quản trị hệ thống. Khi được kết hợp với các tập lệnh shell, ta có thể tự động hóa các tác vụ thường lặp lại tẻ nhạt cũng như phức tạp. 


Tags: Centos

Các tin trước

Bảo mật Apache với Lets Encrypt trên Centos 8 2020-09-19

Tạo chứng chỉ số tự ký trên Apache Centos 8 (self-signed-ssl-certificate) 2020-09-19

Tối ưu SQL với Index, FullText Search 2020-08-10

Bảo mật Apache với Lets Encrypt 2020-08-06

Cài đặt Node.js trên Ubuntu 18.04 2020-08-06

Thực hành bài LAB Toàn tập Select SQL Query 2020-08-05

Cài đặt XAMPP Trên Hệ điều hành Windows 2020-08-05

Toàn tập SQL - Bài tập Lệnh SELECT Database Toàn tập - tinh gọn nhất 2020-08-03

Cài đặt MySQL trên Ubuntu 20.04 2020-07-30

Cấu hình sudoers file trên Ubuntu và Centos 2020-07-07