Thứ sáu, 31/01/2020 | 00:00 GMT+7

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

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áy tính chạy Ubuntu 18.04. Đây có thể là máy local của bạn, máy ảo hoặc server riêng ảo.

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 Ubuntu 18.04 .

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ột máy Ubuntu chưa được cài đặt cron, bạn có thể cài đặt nó bằng APT.

Trước khi cài đặt cron trên máy Ubuntu, hãy cập nhật index gói local của máy tính:

  • sudo apt update

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

  • sudo apt install cron

Bạn cần đảm bảo nó cũng được cài đặt để chạy trong nền:

  • sudo systemctl enable cron
Output
Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable cron

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/crontabs/ .

Để 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

Nếu đây là lần đầu tiên bạn chạy lệnh crontab trong profile user này, nó sẽ nhắc bạn chọn một editor mặc định để sử dụng khi chỉnh sửa crontab của bạn:

Output
no crontab for sammy - 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 4. /bin/ed Choose 1-4 [1]:

Nhập số tương ứng với trình soạn thảo mà bạn chọn. Ngoài ra, bạn có thể chỉ cần nhấn ENTER để chấp nhận lựa chọn mặc định, nano .

Sau khi thực hiện lựa chọn của bạn , bạn sẽ được đưa đến một crontab mới chứa một số hướng dẫn đã được chú thích về cách sử dụng nó:

# Edit this file to introduce tasks to be run by cron. #  # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task #  # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').#  # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. #  # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). #  # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ #  # For more information see the manual pages of crontab(5) and cron(8) #  # m h  dom mon dow   command 

Khi bạn chạy crontab -e trong tương lai, nó sẽ tự động hiển thị crontab của bạn trong editor này. 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ờ ( CTRL + X , Y , sau đó ENTER nếu bạn chọn nano ).

Lưu ý : Trên 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à 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? (y/n)

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. Ví dụ, bạn có thể viết một kịch bản shell để gửi các bản backup dữ liệu đến một giải pháp lưu trữ đối tượng và sau đó tự động hóa nó bằng cron .


Tags:

Các tin liên quan

Cách cài đặt và sử dụng Radamsa để Fuzz kiểm tra các chương trình và dịch vụ mạng trên Ubuntu 18.04
2020-01-30
Cách cài đặt Tinc và thiết lập VPN cơ bản trên Ubuntu 18.04
2020-01-21
Cách thiết lập Nền tảng Eclipse Theia Cloud IDE trên Ubuntu 18.04
2020-01-06
Cách sử dụng Ansible để cài đặt và thiết lập WordPress với LAMP trên Ubuntu 18.04
2019-12-31
Cách cài đặt WordPress với OpenLiteSpeed trên Ubuntu 18.04
2019-12-18
Cách sử dụng Ansible để cài đặt và thiết lập LAMP trên Ubuntu 18.04
2019-12-17
Cách sử dụng Ansible để cài đặt và thiết lập LEMP trên Ubuntu 18.04
2019-12-05
Cách cài đặt và sử dụng TimescaleDB trên Ubuntu 18.04
2019-12-04
Cách lấy chứng chỉ Let's Encrypt bằng Ansible trên Ubuntu 18.04
2019-11-14
Cách cài đặt MongoDB trên Ubuntu 16.04
2019-10-13