Trang chủ / Chuyên đề / Sử dụng Cron để tự động hóa các công việc việc trên server
Thứ sáu, 23/08/2013 | 00:00 GMT+7

Sử dụng Cron để tự động hóa các công việc việc trên server

Một trong những cách phổ biến nhất để chạy các việc ở chế độ nền trên máy Linux là với cron job. Chúng hữu ích cho việc lập lịch (scheduling ) các việc trên VPS và tự động hóa các công việc liên quan đến bảo trì khác nhau. Bản thân “Cron” là một daemon (hoặc chương trình) chạy ở chế độ nền. Lịch (schedule) cho các công việc nằm trong một file cấu hình có tên “crontab”.

Cài đặt

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

Đối với Ubuntu / Debian:

sudo apt-get update
sudo apt-get install cron

Đối với Cent OS / Red Hat Linux:

sudo yum update
sudo yum install vixie-cron crontabs

Bạn cần đảm bảo nó cũng chạy trong nền:

sudo /sbin/chkconfig crond on
sudo /sbin/service crond start

Cú pháp

Một ví dụ ta muốn chạy: 

5 * * * * curl http://www.google.com

Cú pháp cho các công việc đặt trong crontab có thể trông phức tạp. Nhưng nó thực sự rất ngắn gọn và dễ hiểu nếu ta đọc đúng cách. Mỗi lệnh được chia thành:

  • Lich chạy (Schedule)
  • Lệnh chạy (Command) 

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 tùy chọn khác nhau để lập lịch trình theo thứ tự sau:

  • minute
  • hour
  • day of the month
  • month
  • day of the week

Ví dụ

Dưới đây là danh sách các ví dụ về một số lịch phổ biến.

Để chạy một lệnh mỗi phút:

* * * * *

Để chạy lệnh 12 phút một lần vào giờ:

12 * * * *

Bạn cũng có thể sử dụng các tùy chọn khác nhau cho từng trình giữ chỗ. Để chạy một lệnh sau mỗi 15 phút:

0,15,30,45 * * * *

Để chạy một lệnh hàng ngày vào lúc 4:00 sáng, bạn sẽ sử dụng:

0 4 * * *

Để chạy lệnh lúc 4:00 sáng Thứ Ba hàng tuần, bạn sẽ sử dụng:

0 4 * * 2

Bạn có thể sử dụng sự phân chia trong lịch trình của bạn. Thay vì liệt kê 0,15,30,45, bạn cũng có thể sử dụng như sau:

*/4 2-6 * * *

Lưu ý phạm vi “2-6 ”. Cú pháp này sẽ chạy lệnh trong repositoryảng thời gian từ 2 giờ sáng đến 6 giờ sáng.

Cấu hình

Khi bạn đã có một lịch phù hợp, thì cần một nơi để đặt nó để daemon của bạn có thể đọc nó, đó là trong file /var/spool/cron/crontab , nhưng chúng không nên edit trực tiếp với Editor (trình soạn thảo). Thay vào đó là sử dụng lệnh crontab .

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

crontab -e

Thao tác này sẽ hiển thị một editor, nơi 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ỗi dòng.

Nếu bạn muốn chỉ xem crontab, dùng lệnh sau:

crontab -l

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

crontab -r

Nếu bạn là user root, hoặc có đủ quyền thì có thể chỉnh sửa user khác bằng cách chỉ định crontab -u <user> -e

Lưu kết quả cron

Đối với việc cron được thực thi, địa chỉ email của user được liên kết với user đó sẽ nhận được kết quả qua email, hoặc được chuyển hướng vào file log hoặc vào /dev/null. Địa chỉ email có thể được chỉ định theo cách thủ công nếu bạn cung cấp cài đặt “MAILTO” ở đầu crontab. Bạn cũng có thể chỉ định shell bạn muốn chạy, đường dẫn nơi tìm kiếm binary (nhị-phân) cron và folder chính với ví dụ sau:

Đầu tiên, hãy chỉnh sửa crontab:

crontab -e

Sau đó, ta sẽ chỉnh sửa nó như vậy:

SHELL=/bin/bash
HOME=/
MAILTO=”example@digitalocean.com”
#This is a comment
* * * * * echo ‘Run this command every minute’

Công việc cụ thể này sẽ xuất ra "Chạy lệnh này mỗi phút." Kết quả đó sẽ được gửi qua email mỗi phút đến địa chỉ email “ example@digitalocean.com ” mà ta đã chỉ định. Rõ ràng, đó có thể không phải là một tình huống lý tưởng. Như đã đề cập, ta cũng có thể chuyển kết quả vào file log hoặc vào một vị trí trống để tránh nhận được email kết quả.

Để thêm vào một file log, nó đơn giản như sau:

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

Lưu ý: “ >> ” gắn vào một file.

Nếu bạn muốn chuyển đến một vị trí trống, hãy sử dụng /dev/null . Đây là một tập lệnh PHP được thực thi và chạy trong nền.

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

Hạn chế quyền truy cập

Hạn chế quyền truy cập vào cron là dễ dàng với các /etc/cron.allow/etc/cron.deny file. Để cho phép hoặc từ chối user, bạn chỉ cần đặt tên user của vào một trong các file này, tùy thuộc vào quyền truy cập được yêu cầu. Để từ chối quyền truy cập cho tất cả user và cấp quyền truy cập cho user có tên tdurden, bạn sẽ sử dụng chuỗi lệnh sau:

echo ALL >>/etc/cron.deny
echo tdurden >>/etc/cron.allow

Đầu tiên, ta khóa tất cả user bằng cách thêm “ ALL ” vào file deny (từ chối). Sau đó, bằng cách thêm tên user vào file cho phép, ta cấp cho user quyền truy cập để thực thi các công việc cron.

Cú pháp đặc biệt

Có một số lệnh ngắn gọn mà bạn có thể sử dụng trong file crontab  để quản trị dễ dàng hơn một chút. Chúng là các lệnh tắt:

  • @hourly - Viết tắt cho 0 * * * *
  • @daily - Viết tắt cho 0 0 * * *
  • @weekly - Viết tắt cho 0 0 * * 0
  • @monthly - Viết tắt cho 0 0 1 * *
  • @yearly - Viết tắt cho 0 0 1 1 *

@reboot , chạy lệnh một lần khi khởi động server.

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 sử dụng.

Để một việc chạy ngay sau khi khởi động server, bạn sẽ chỉnh sửa file crontab của bạn ( crontab -e ) và đưa dòng sau vào:

@reboot echo "System start up"

Lệnh cụ thể này sẽ được thực thi và sau đó được gửi qua email cho user được chỉ định trong crontab.


Tags:

Các tin trước

Bảo mật postgresql trên Ubuntu vps 2013-08-22

Sử dụng sftp-to-securely-transfer-files với remote-server 2013-08-13

Quản trị packages trong Ubuntu và Debian với apt-get-apt-cache 2013-08-06

Sử dụng roles và quản lý cấp quyền trong postgresql trên vps 2013-08-05

Lệnh truy vấn SQL trong postgresql sử dụng select 2013-08-02

Các lệnh truy cấn quản lý bảng dữ liệu trong postgresql trên cloud-server 2013-08-01

Bảo mật MySQL và MariaDB Databases trên Linux VPS 2013-07-23

Cài đặt Firewall với UFW trên Ubuntu và Debian Cloud Server 2013-06-25

Cơ bản nhất về MYSQL trên Ubuntu CentOS 2012-06-12