Cron job là gì ? Thực hành cơ bản với các lệnh cron job

2404
16-10-2018
Cron job là gì ? Thực hành cơ bản với các lệnh cron job

Cron Job là gì? Cron Job có thể khiến các bạn tiết kiệm được thời gian để xử lý những tác vụ tự động. Trong bài viết này, Bizfly Cloud sẽ chia sẽ cho các bạn hiểu được khái niệm của Cron Job và cách sử dụng.  

Cron job là gì? 

Cron job là một lệnh Linux dùng để lên kế hoạch cho một nhiệm vụ sẽ được thực thi trong tương lai. Thông thường, lệnh sẽ được sử dụng để lên lịch định kỳ cho một tác vụ - ví dụ, thực hiện gửi thông báo mỗi sáng. Một số tập lệnh, chẳng hạn như Drupal, WHMCS có thể sẽ yêu cầu bạn thiết lập một cron job để thực hiện một số chức năng nhất định.

Với phần lớn các cron job, có ba thành phần hiện hữu như sau:

1. Script (kịch bản lệnh) được gọi hoặc được thực hiện.

2. Command (Câu lệnh) thực thi script trên cơ sở reoccurring. Thao tác này thường được thiết lập trong cPanel.

3. Các hoạt động hoặc đầu ra/output của script, phụ thuộc vào những gì script được gọi ra và thực thi. Thông thường, các script được gọi là cron job sẽ sửa đổi các tệp hoặc các cơ sở dữ liệu; tuy nhiên chúng cũng có thể thực hiện các tác vụ khác không bao gồm sửa đổi dữ liệu trên máy chủ, như gửi thông báo qua email chẳng hạn.

Hầu hết các script yêu cầu sử dụng cron job sẽ cung cấp các hướng dẫn cụ thể để bạn biết cần phải thiết lập những gì với các ví dụ thường xuyên được đưa ra.

 Ưu, nhược điểm nổi bật của Cron job

Cron job là một công cụ hữu ích giúp tự động hóa các tác vụ thủ công có tính chất lặp lại. Cron job có nhiều ưu điểm và có thể giúp bạn tiết kiệm thời gian về lâu dài. Bên cạnh đó, chúng cũng có một nhược điểm mà bạn cần cân nhắc trước khi sử dụng.

1. Ưu điểm

Cron job giúp giải phóng thời gian và tiết kiệm chi phí cho bạn. Thay vì phải dành thời gian để lên lịch các task theo cách thủ công, các Cron job có thể được thiết lập tự động chạy vào các thời điểm hoặc khoảng thời gian cụ thể. Bạn không phải lo lắng về việc bỏ lỡ một nhiệm vụ quan trọng, chẳng hạn như gửi email tiếp thị hoặc cập nhật hình ảnh trên trang web…

Cron job cũng giúp tiết kiệm chi phí bằng cách giảm thiểu lượng thời gian dành cho các công việc tẻ nhạt, như cập nhật social media, thực hiện sao lưu hoặc theo dõi các trang web để biết những thay đổi về lưu lượng truy cập. Với Cron job scheduler, tất cả công việc này sẽ được thực hiện tự động khi đã được lên lịch. Bạn có thể dành thời gian của mình để tập trung vào các công việc có ý nghĩa hơn.

2. Nhược điểm

Tuy nhiên, Cron job cũng tồn tại một số hạn chế, vì vậy hãy đảm bảo rằng Cron job phù hợp với nhu cầu của bạn hoặc có phương án khắc phục phù hợp.

  • Cron job chỉ có thể thực hiện câu lệnh theo chu kỳ 60 giây trở lên.
  • Các Cron job trong một mạng không thể được phân phối cho nhiều máy tính. Do đó, nếu máy tính chạy cron bị treo sẽ ảnh hưởng đến các task đã được lên lịch đang thực hiện.
  • Không có cơ chế re-enter. Cron được tạo ra để chạy chính xác vào những thời điểm đã chọn. Nếu bất kỳ lệnh Cron nào không chạy được, nó sẽ chạy vào thời gian đã lên lịch tiếp theo. Điều này cho thấy Cron không được sử dụng cho các incremental job.

Cách thêm và xóa cron job trong cPanel

Thêm 1 cron job

Bạn có thể chọn để nhận email mỗi khi 1 cron job chạy 1 command bằng cách gán địa chỉ email của bạn vào trường Email trong page công cụ. Nếu bạn không muốn nhận email cho mỗi cron job, sử dụng lệnh sau để chuyển hướng đầu ra của cron job đến / dev / null:

your_command_here >/dev/null 2>&1

Cron job là gì ? Thực hành cơ bản với các lệnh cron job - Ảnh 1.

Tiếp theo, chọn tần suất chạy cho lệnh, bạn chọn một tùy chọn trong mỗi box hoặc chọn khoảng thời gian đẫ xác định trước từ menu Common Settings.

Sau đó, thêm lệnh mà bạn muốn thực thi trong trường Command và nhấn nút Add New Cron Job.

Xóa 1 cron job

Khi một cron job không còn cần thiết, bạn nên xóa cron job đó để lệnh không tiếp tục chạy nữa. Để thực hiện xóa, bạn nhấp vào nút Delete bên cạnh mục nhập lệnh mong muốn.

Thực hành cơ bản với các lệnh cron job

Sau đây là một số lệnh thực hành cơ bản nhất khi làm việc với cron job.

Lên lịch nhiệm vụ với cron job

Cú pháp lệnh:

Dưới đây là 1 cron job đơn giản:

/usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1

Có 2 phần chính trong lệnh trên:

1. Phần đầu tiên là "10 * * * *". Đây là bước thiết lập thời gian.

2. Phần còn lại của câu lệnh là dòng lệnh sử dụng để chạy.

Có 3 phần trong dòng lệnh như sau:

1. "/usr/bin/php". PHP script sẽ không không tự thực thi lệnh, bởi vậy ta cần chạy lệnh thông qua PHP parser (Trình phân tích cú pháp PHP).

2. "/www/virtual/username/cron.php". Đường dẫn đến script.

3. "> /dev/null 2>&1". Phần này sẽ xử lý đầu ra của script/

Cú pháp đặt thông số thời gian

Đây là phần đầu tiên trong chuỗi cron job trong lệnh cron job phía trên. Phần này xác định tần suất và thời điểm cron job sẽ chạy.

Trong phần lệnh này bao gồm 5 yếu tố:

1. Phút chạy

2. Giờ chạy

3. Ngày chạy trong tháng

4. Tháng chạy

5. Ngày trong tuần

Hình ảnh minh họa như sau:

Cron job là gì ? Thực hành cơ bản với các lệnh cron job - Ảnh 4.

Dấu sao

Các dấu hoa thị hay dấu sao (*) sẽ xuất hiện khá thường xuyên thay vì một chữ số cụ thể. Điều này tương ứng với tất cả các số có thể cho vị trí đó. Ví dụ, dấu sao ở vị trí phút có nghĩa là lệnh sẽ chạy mỗi phút.

Bạn xem một số ví dụ sau đây để hiểu về cách thức hoạt động của cú pháp này.

Ví dụ:

- Cron job này sẽ chạy mỗi phút toàn thời gian:

1

* * * * * [command]

- Cron job này sẽ chạy bắt đầu từ phút 0, mỗi giờ (tức là một công việc định kỳ hàng giờ):

1

0 * * * * [command]

- Lệnh sau cũng là một cron job định kỳ hàng giờ nhưng thay vào đó sẽ bắt đầu vào phút thứ 15 (00:15, 01:15, 02:15…)

1

15 * * * * [command]

- Lệnh sẽ chạy một lần một ngày, lúc 2:30 sáng:

1

30 2 * * * [command]

- Lệnh sẽ chạy mỗi tháng một lần, vào ngày thứ hai của tháng và bắt dầu vào nửa đêm (tức là ngày 2 tháng 1 lúc 12:00 sáng, ngày 2 tháng 2 12:00 sáng, …):

1

0 0 2 * * [command]

- Lệnh sẽ chạy vào các ngày Thứ Hai, mỗi giờ (tức là 24 lần trong một ngày, nhưng chỉ vào các ngày Thứ Hai):

1

0 * * * 1 [command]

- Bạn có thể sử dụng nhiều số được phân tách bằng dấu phẩy. Lệnh sau sẽ chạy ba lần mỗi giờ, ở phút 0, 10 và 20:

1

0,10,20 * * * * [command]

- Dấu gạch chéo cũng dowcj sử dụng trong lệnh. Lệnh sau sẽ chạy 12 lần mỗi giờ, tức là cứ 5 phút một lần:

1

*/5 * * * * [command]

- Dấu gạch ngang sẽ được sử dụng để chỉ định một phạm vi. Lệnh sau sẽ chạy một lần mỗi giờ từ 5:00 sáng đến 10:00 sáng:

1

0 5-10 * * * [command]

- Ngoài ra còn có một từ khóa đặc biệt sẽ cho phép bạn chạy một cron job mỗi khi máy chủ được khởi động lại:

1

@reboot [command]

Chỉnh sửa crontab

Khi chạy lệnh sau sẽ khởi động vi (trình soạn thảo văn bản) và cho phép chỉnh sửa nội dung của crontab:

1

crontab -e

Như vậy, bạn sẽ được làm quen với các lệnh vi cơ bản vì nó hoàn toàn khác so với bất kỳ trình soạn thảo văn bản nào khác mà bạn có thể đã từng làm việc.

Nếu bạn chỉ muốn xem crontab hiện tại mà không cần chỉnh sửa, bạn có thể chạy lệnh sau:

1

crontab -l

Để xóa nội dung trong crontab:

1

crontab -r

Tải file

Bạn có thể viết tất cả các cron job vào một file và sau đó đẩy nó vào crontab:

1

crontab cron.txt

Tuy nhiên bạn nên cẩn thận với thao tác này, bởi có thể lệnh sẽ ghi đè lên tất cả các cron job hiện có với nội dung của file này mà không có bất kỳ cảnh báo nào.

Comments/Nhận xét

Bạn có thể thêm nhận xét sau ký tự #.

1

2

# This cron job does something very important

10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1

Thiết lập Email

Như đã nói, theo mặc định đầu ra từ các crons sẽ được gửi qua e-mail, trừ khi bạn loại bỏ chúng hoặc chuyển hướng chúng đến một file. Cài đặt MAILTO cho phép bạn đặt hoặc thay đổi địa chỉ email gửi tới:

1

2

3

MAILTO="username@example.com"

# This cron job does something very important

10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1

Sử dụng PHP parser

CGI script sẽ được thực thi theo mặc định, nhưng PHP script thì không. Chúng cần chạy thông qua trình phân tích cú pháp PHP. Đó là lý do tại sao cần phải đặt đường dẫn đến trình phân tích cú pháp trước đường dẫn của tập lệnh.

1

* * * * * /usr/bin/php [path to php script]

Đôi khi đó có thể là một địa chỉ khác như: "/ usr / local / bin / php". Để tìm hiểu, bạn có thể thử chạy dòng lệnh:

1

which php

Xử lý output

Nếu bạn không xử lý output của tập lệnh cron, chúng sẽ được gửi đi dưới dạng e-mail đến tài khoản người dùng của bạn trên máy chủ.

Loại bỏ output

Nếu bạn thêm "> /dev/null 2>&1" vào phần cuối câu lệnh cron job (hoặc bất cứ câu lệnh nào), output sẽ được loại bỏ.

Dấu đóng (>) được sử dụng để chuyển hướng output. "/ dev / null" được xem như một "hố đen". Bất cứ thành phần nào ở trong đó đều được hệ thống bỏ qua.

Phần "2> & 1" gây ra chuyển hướng (lỗi) STDERR output đến STDOUT (bình thường) output. Vậy nên nó cũng nằm trong "/ dev / null".

Xuất ra 1 file

Để lưu trữ cron job trên 1 file, tiếp tục sử dụng dấu đóng (>).

1

10 * * * * /usr/bin/php /www/virtual/username/cron.php > /var/log/cron.log

Như vậy  file output sẽ được viết lại mỗi lần. Nếu bạn muốn nối output ở cuối tệp thay vì viết lại hoàn toàn, sử dụng dấu ngoặc kép (>>) thay vào đó:

1

10 * * * * /usr/bin/php /www/virtual/username/cron.php >> /var/log/cron.log

Script có thể thực thi

Thông thường, bạn sẽ cần xác định trình phân tích cú pháp khi bất đầu câu lệnh nhưng trên thực tế bẫn có cách để PHP script có thể thực thi từ dòng lệnh như 1 CGI script.

Bạn cần thêm đường dẫn vào trình phân tích cú pháp làm dòng đầu tiên của script:

Ngoài ra hãy chắc chắn để thiết lập chmod thích hợp (như 755) để tập tin có thể thực thi được.

Cron job là gì ? Thực hành cơ bản với các lệnh cron job - Ảnh 5.

Khi bạn đã có script có thể thực thi được, cron job có thể chỉ gắn gọn như sau

1

10 * * * * /www/virtual/username/hello.php

Ngăn chặn các xung đột cron job

Trong một số trường hợp, bạn có thể chạy một vài cron job thường xuyên và bạn sẽ không muốn những cron job này xung đột với nhau nếu chúng mất nhiều thời gian để chạy hơn dự kiến.

Ví dụ, bạn có thể có 1 cron job chạy mỗi phút, và tất nhiên thỉnh thoảng sẽ mất nhiều hơn 1 phút để chạy cron job đó, Và như vậy sẽ xảy ra vấn đề khi 1 cron script tương tự bắt đầu khởi chạy trong khi cron job trước đó chưa hoàn thành. Nếu có quá nhiều quy trình như vậy được tạo ra sẽ có nguy cơ  hỏng server khi các cron job tiếp tục xung đột và trì trệ.

Vấn đề này có thể được giải quyết thông qua khóa tập tin, cụ thể hơn là sử dụng loại non-blocking (LOCK_NB). (Nếu bạn không quen với việc khóa tệp, hãy tìm hiểu trước khi sử dụng (http://php.net/manual/en/function.flock.php)).

Bạn có thể thêm phần code sau vào script cron job:

Cron job là gì ? Thực hành cơ bản với các lệnh cron job - Ảnh 6.

Với khóa file thông thường, hàm gọi flock() sẽ chặn tập lệnh nếu có khóa đang tồn tại, và sẽ được bỏ chặn khi khóa được gỡ. 

Tuy nhiên với khóa non-blocking như trong phần code phía trên, hàm gọi sẽ không dừng script mà lập tức chuyển sang FALSE nếu có khóa tồn tại. Vì vậy, trong trường hợp này chúng ta có thể thoát script ngay khi thấy có khóa bởi như vậy có nghĩa là 1 cron job khác cũng đang chạy.

Chặn truy cập cron job từ Web

Khi bạn viết một cron job theo một ngôn ngữ kịch bản web như PHP chẳng hạn, bạn sẽ muốn đảm bảo rằng người khác sẽ không thể thực hiện được các lệnh đó chỉ bằng cách download xuống từ trình duyệt.

Một phương án xử lý khá đơn giản cho tình huống này, bạn lưu trữ các script đó bên ngoài web folder của mình. Tuy nhiên, cách này có thể không thực tiễn hoặc không được các developer ủng hộ trong trường hợp dev muốn giữ các script cron job của họ bên trong các folder ứng dụng web của mình.

Nếu bạn muốn cho tất cả các script cron job vào một folder, bạn chặn truy cập bằng cách đưa dòng sau vào một .htaccess file:

1

deny from all

Hoặc bạn cũng có thể chặn truy cập vào script trên cơ sở cá nhân bằng cách đưa dòng sau vào phần mở đầu:

1

if (isset($_SERVER['REMOTE_ADDR'])) die('Permission denied.');

Điều này sẽ đảm bảo rằng, khi tập lệnh được truy cập từ web, tập lệnh sẽ bị hủy ngay lập tức.

Mặc dù cron job được xem như một công cụ dành cho quản trị viên hệ thống, nhưng công cụ này thực sự có liên quan đến nhiều loại ứng dụng web. Vì vậy, tìm hiểu về công cụ này có thể sẽ hữu ích đối với nhiều công việc khác nhau.

TAGS: Cron job
SHARE