Thứ hai, 10/02/2020 | 00:00 GMT+7

Cách sử dụng Cron để tự động hóa công việc trên CentOS 8

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 giống Unix, bao gồm cả các bản phân phối Linux. Cron chạy trong nền và các việc được lập lịch với cron, được gọi là “cron job”, được thực thi tự động, làm cho cron hữu ích để tự động hóa các việc liên quan đến bảo trì.

Hướng dẫn này cung cấp tổng quan về cách lập lịch tác vụ bằng cú pháp đặc biệt của cron. Nó cũng đi qua 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 truy cập vào một máy tính chạy CentOS 8. Đây có thể là máy local , máy ảo hoặc server riêng ảo của bạn.

Dù bạn sử dụng loại máy tính nào để làm theo hướng dẫn này, nó phải có user không phải root có quyền quản trị được cấu hình . Để cài đặt điều này, hãy làm theo hướng dẫn Cài đặt Server Ban đầu của ta cho CentOS 8 .

Cài đặt Cron

Hầu hết mọi 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 máy CentOS, hãy cập nhật index gói local của máy tính:

  • sudo dnf update

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

  • sudo dnf install crontabs

Lệnh này sẽ nhắc bạn xác nhận bạn muốn cài đặt gói crontabs và các phụ thuộc của nó. Làm như vậy bằng cách nhấn y rồi nhấn ENTER .

Thao tác này sẽ cài đặt cron trên hệ thống của bạn, nhưng bạn cần khởi động daemon theo cách thủ công. Bạn cũng cần đảm bảo nó được cài đặt để chạy khi nào server khởi động. Bạn có thể thực hiện cả hai hành động 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 chạy khi nào server khởi động, hãy nhập:

  • sudo systemctl enable crond.service

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

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 đặc biệt được gọi là crontab . Mỗi profile user trên hệ thống có thể có crontab của riêng họ, nơi họ 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 của bạn để chỉnh sửa và thêm một công việc đượ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 tử: lịch trình và lệnh chạy.

Lệnh có thể là hầu như bất kỳ lệnh nào bạn thường chạy trên dòng lệnh. Thà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:

Cánh đồng Giá trị được 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

Cùng với nhau, các việc đượ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 

Đây là một ví dụ chức năng của một biểu thức cron. Biểu thức này 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òn có một số ký tự đặc biệt mà bạn có thể đưa vào thành phần lịch biểu của biểu thức 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 đó, một 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 * * * * ... ), bạn có thể đạt được cùng chức năng với một ( 0,30 * * * * ... ).
  • - : Dấu gạch nối thể hiện một dải giá trị trong trường lịch biểu. 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ị bước. Ví dụ: thay vì viết ra tám tác vụ cron riêng biệt để chạy một 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ập lịch để nó chạy như sau: 0 */3 * * * ...

Lưu ý : Bạn không thể biểu thị giá trị bước một cách tùy tiện; bạ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ờ”, bạn 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 về cách sử dụng thành phần lập lịch 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 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 bất kỳ điều nào trong số này khó hiểu hoặc nếu bạn muốn trợ giúp viết lịch trình cho các nhiệm vụ cron của riêng mình, Cronitor cung cấp một trình soạn thảo biểu thức lịch biểu cron tiện dụng có tên “Crontab Guru” mà bạn có thể sử dụng để kiểm tra xem lịch biểu cron của bạn có hợp lệ hay không.

Quản lý Crontabs

Khi bạn đã ổn định lịch trình và bạn biết công việc bạn muốn thực hiện, bạn cần đặt nó ở nơi nào đó daemon của bạn có thể đọc được.

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

Bạn có thể chỉnh sửa crontab của bạn bằng lệnh sau:

  • crontab -e

Thao tác này sẽ mở crontab của bạn trong editor mặc định của profile user của bạn.

Lưu ý : Trên server CentOS 8 mới, lệnh crontab -e sẽ mở crontab của user với vi theo mặc định. vi là một editor cực kỳ mạnh mẽ và linh hoạt, nhưng nó có thể hơi khó hiểu đối với những user chưa quen .

Nếu bạn muốn sử dụng editor dễ tiếp cận hơn làm editor crontab mặc định của bạn , bạn có thể cài đặt và cấu hình nano như vậy.

Để làm như vậy, hãy cài đặt nano với dnf :

  • sudo dnf install nano

Khi được yêu cầu , hãy nhấn y và sau đó ENTER để xác nhận bạn muốn cài đặt nano .

Để đặt nano làm editor trực quan mặc định của profile user , hãy mở file .bash_profile để chỉnh sửa. Đến đây bạn đã cài đặt nó, bạn có thể làm như vậy với nano :

  • 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 file bằng cách nhấn CTRL + X , Y , sau đó ENTER .

Sau đó reload .bash_profile để shell nhận thay đổi mới:

  • . ~/.bash_profile

Khi ở trong editor , bạn có thể nhập lịch trình của bạn 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 ngay bây giờ. Nếu bạn đã mở crontab của bạn bằng vi , editor mặc định của CentOS 8, bạn có thể thực hiện 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 ý , trên các hệ thống Linux, có một crontab khác được lưu trữ trong folder /etc/ . Đây là một crontab toàn hệ thống có một trường bổ sung mà profile user 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 user , 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 bạn muốn xem nội dung crontab của bạn , nhưng không chỉnh sửa nó, bạn có thể sử dụng lệnh sau:

  • crontab -l

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

Cảnh báo : Lệnh sau sẽ không yêu cầu bạn xác nhận bạn muốn xóa crontab của bạn . 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 này sẽ xóa crontab của user ngay lập tức. Tuy nhiên, bạn có thể bao gồm cờ -i để có dấu nhắc lệnh xác nhận bạn thực sự muốn xóa crontab của user :

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

Khi được yêu cầu , bạn phải nhập y để xóa crontab hoặc n để hủy xóa.

Quản lý kết quả công việc Cron

Bởi vì các công việc cron đượ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. Đến đây 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 với một số cách khác nhau để chuyển hướng kết quả của công việc cron để giúp bạn theo dõi rằng chúng đã được thực hiện thành công hay chưa.

Nếu bạn có một tác nhân truyền thư - chẳng hạn như Sendmail - được cài đặt và cấu hình đúng cách trên server của bạn , bạn có thể gửi kết quả của các việc cron đến địa chỉ email được liên kết với profile user 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 crontab.

Ví dụ, bạn có thể thêm các dòng sau vào crontab. Chúng bao gồm một MAILTO tuyên bố tiếp theo là một địa chỉ email Ví dụ, một SHELL chỉ thị cho biết vỏ để chạy ( bash trong ví dụ này), một HOME chỉ trỏ đến con đường, trong đó để tìm kiếm binary cron, và một nhiệm vụ cron duy nhất:

. . .  MAILTO="example@digitalocean.com" SHELL=/bin/bash HOME=/  * * * * * echo ‘Run this command every minute’ 

Công việc cụ thể 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 kết quả của tác vụ cron thành file log hoặc vào một vị trí trống để ngăn nhận được email cùng với kết quả .

Để nối kết quả của lệnh đã lên lịch vào file log , hãy thêm >> vào cuối lệnh, sau đó là tên và vị trí của file log 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 ở chế độ nền. Để làm như vậy, bạn có thể chuyển hướng kết quả 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ụ: công việc 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 tiêu chuẩn - được biểu thị bằng 2 - đến kết quả tiêu chuẩn ( >&1 ). Bởi vì kết quả tiêu 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 im lặng. Ngay cả khi crontab chứa câu lệnh MAILTO , kết quả 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 user nào được phép sử dụng lệnh crontab bằng các file cron.allowcron.deny , cả hai file này đều được lưu trữ trong folder /etc/ . Nếu file cron.deny tồn tại, mọi user đượ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 user đượ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 user được liệt kê trong mỗi file , file cron.allow sẽ overrides cron.deny và user 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ả user và sau đó cấp quyền truy cập cho ishmael của user , 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ả user bằng cách thêm ALL vào file cron.deny . Sau đó, bằng cách thêm tên user vào file cron.allow , ta cấp quyền truy cập profile user ishmael để thực thi các công việc cron.

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

  • sudo crontab -u user -e

Tuy nhiên, nếu cron.deny tồn tại và user đượ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ả user đều có quyền truy cập vào cron trừ khi tồn tại cron.allow hoặc cron.deny .

Cú pháp đặc biệt

Ngoài ra còn có một số lệnh ngắn gọn mà bạn có thể sử dụng trong file crontab của bạn để giúp sắp xếp lịch trình công việc. Về cơ bản, chúng là các phím tắt cho lịch biểu số tương đương được chỉ định:

Đường tắt 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 version cũ hơn), vì vậy hãy kiểm tra kỹ nó hoạt động trước khi bạn dựa vào nó.

Ngoài ra, @reboot@reboot sẽ chạy bất kỳ lệnh nào theo sau nó bất kỳ lúc nào server khởi động:

@reboot echo "System start up" 

Sử dụng các phím tắt này khi nào có thể có thể giúp diễn giải lịch trình tác vụ trong crontab của bạn 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, bạn có thể tự động hóa các việc thường tẻ nhạt hoặc phức tạp.


Tags:

Các tin liên quan

Cách thiết lập khóa SSH trên CentOS 8
2020-02-06
Cách cài đặt và sử dụng TimescaleDB trên CentOS 7
2020-02-03
Cách thiết lập Nền tảng Eclipse Theia Cloud IDE trên CentOS 7
2020-01-24
Cách thiết lập ứng dụng Node.js để sản xuất trên CentOS 7
2019-10-28
Cách cấu hình Cụm Galera với MariaDB trên server CentOS 7
2019-07-10
Cách sử dụng Chế độ độc lập của Certbot để lấy chứng chỉ SSL của Let's Encrypt trên CentOS 7
2019-05-31
Cách cài đặt và cấu hình Zabbix để giám sát an toàn server từ xa trên CentOS 7
2019-05-29
Cách tạo một cụm Kubernetes bằng Kubeadm trên CentOS 7
2019-04-24
Cách cài đặt và sử dụng ClickHouse trên CentOS 7
2019-04-15
Cách thu thập số liệu cơ sở hạ tầng với Metricbeat trên CentOS 7
2019-03-27