Cron trong linux cho newbie
Bài đăng này đã không được cập nhật trong 3 năm
Nếu bạn cần chạy những công việc (tôi sẽ gọi là task) ở phía server một cách lặp lại theo thời gian định trước nào đó thì có lẽ Cron sẽ giúp được cho bạn. Vậy Cron nó là cái gì ?
Định nghĩa
Cron là một tiện ích giúp lập lịch chạy những dòng lệnh bên phía server để thực thi một hoặc nhiều công việc nào đó theo thời gian được lập sẵn. Một số người gọi những công việc đó là Cron job hoặc Cron task.
Cron là một chương trình deamon, tức là nó được chạy ngầm mãi mãi một khi nó được khởi động lên. Như các deamon khác thì bạn cần khởi động lại nó nếu như có thay đổi thiết lập gì đó. Chương trình này nhìn vào file thiết lập có tên là crontab để thực thi những task được mô tả ở bên trong.
Bình thường thì những người quản trị server sẽ rất hay dùng đến tiện ích này, nhưng những web developer thì sao? Họ đôi khi cũng cần đến những chức năng kiểu lập lịch này. Ví dụ :
- Bạn hoàn toàn có thể cài đặt để cron job thực thi việc quét xem những user trial nào đã bị expired và delete hoặc set inactive tài khoản của họ.
- Gửi đi những email tới user sử dụng hệ thống hàng ngày hay hàng tuần ...
- Xoá bỏ những file cache hàng tháng khi nó quá lớn
- Kiểm tra hàng ngày xem những link nào của website bị hỏng hay không để nhanh chóng khắc phục
- Backup cơ sở dữ liệu
Sử dụng Cron như nào?
Cú pháp của Cron
Hãy xem dòng code sau
20 * * * * /usr/bin/php /var/www/html/dailycron.php > /home/yourname/logs/phplog.txt
Đây là đoạn mô tả cron task rất đơn giản, nó có 2 phần chính
-
- Đoạn 20 * * * * là nơi chứa cài đặt về lịch biểu chạy của cron, chi tiết ở mục sau.
-
- Đoạn sau đó là những lệnh sẽ được thực thi. Tuỳ mục đích mà phần này có thể cài đặt khác nhau.
Như trong ví dụ trên thì bản thân đoạn lệnh thực thi bao gồm 3 phần là
- /usr/bin/php vì mã PHP không thể tự chạy mà phải có parser nên có khai báo này giúp cron biết nó cần vào đâu để tìm.
- /var/www/html/dailycron.php phần là đơn giản là đường dẫn đến file chứa các mã lệnh PHP sẽ được chạy
- > /home/yourname/logs/phplog.txt cuối cùng là nếu bạn cần output của các mã lệnh thì sẽ khai báo xem chúng sẽ được ghi ra đâu.
Cú pháp cài đặt lịch biểu
Như ở trên bạn sẽ thấy rằng lịch biểu của Cron bao gồm 5 phần có thể khai báo hoặc không, cụ thể chúng là :
- phút : giá trị từ 0 đến 59
- giờ : giá trị từ 0 đến 23
- ngày của tháng : từ ngày 1 đến ngày 31
- tháng : từ tháng 1 đến tháng 12
- ngày trong tuần : từ 0 (Chủ nhật) đến 6 (thứ 2)
Nếu không khai báo số cụ thể thì bạn sẽ để *, kí hiệu này thay thế cho tất cả các con số trên. Vậy ví dụ của tôi sẽ có nghĩa là : chạy mã lệnh PHP có trong file theo đường dẫn kia vào thời điểm số phút là 20 mà không cần biết là giờ nào, ngày tháng nào và ghi output ra file.
Ngoài dùng * thì bạn có thể dùng những kí hiệu khác với ý nghĩa như sau :
- dùng dấu phẩy , để thiết lập nhiều số cho nhiều thời điểm. Ví dụ tôi muốn cứ vào phút thứ 20 và 40 lệnh sẽ được chạy :
20,40 * * * * <run command here>
- dùng dấu xuộc / để chia đều khoảng cách thời gian được chạy. Ví dụ tôi muốn cứ 5 phút quét hệ thống 1 lần để kiểm tra xem có sự bất thường nào không :
*/5 * * * * <scan system now>
- dùng dấu gạch ngang - để chỉ khoảng thời gian. Ví dụ cứ vào 10h30 11h30 12h30 sáng sẽ chạy lệnh.
30 10-12 * * * <command>
- đặc biệt bạn có thể dùng @reboot để chạy lệnh nào đó khi mà server boot lại. Chẳng hạn khởi động một số chương trình không tự khởi động lại được khi server bị reboot.
@reboot <start some program>
- Ngoài ra bạn còn có thể dùng các thiết lập đặc biệt khác
Những lệnh và khai báo cơ bản của Cron task
Lệnh
Bạn dùng lệnh dưới để mở file crontab rồi thiết lập những lịch biểu của bạn :
crontab -e
Nếu bạn có nhiều texteditor thì sẽ có xác nhận xem bạn chọn cái nào để chỉnh sửa file crontab. Và nếu bạn chưa từng thiết lập gì trước đó thì 1 file mới sẽ được tạo với nội dung trống (có thể có nhưng chỉ là comment của Cron, bắt đầu bằng dấu #). Hãy thử điền nội dung và save lại.
Trong trường hợp bạn chỉ muốn xem nội dung file đó đang có những gì thì sẽ dùng
crontab -l
Và nếu bạn muốn xoá nội dung file thiết lập crontab đi thì dùng
crontab -r
Như ví dụ thì tôi sẽ đẩy output ra file log nhưng nếu bạn muốn bỏ qua tất cả bao gồm cả các lỗi thì có thể thay bằng > /dev/null 2>&1. Đoạn lệnh này sẽ cho tất cả chúng vào 1 cái hố đen là _/dev/null.
Ngoài ra thì mỗi lần chạy với > thì kết quả sau sẽ ghi đè lên kết quả chạy trước. Do đó nếu muốn lấy kết quả của tất cả các lần chạy thì bạn cần phải append vào file bằng cách dùng 2 dấu >>. Nhưng lưu ý là file của bạn có thể sẽ rất lớn nếu cron task được chạy hàng ngày.
Khai báo
Trong file thiết lập crontab bạn có thể khai báo những thông số sau để chỉ định chúng theo ý mình
- SHELL : là shell mà cron chạy. Nếu bạn không chỉ định thì mặc định sẽ là những shell ở trong file /etc/paswwd
- PATH : thay vì sử dụng full path trong cron thì bạn có thể khai báo PATH để dùng đi dùng lại nhiều lần.
- MAILTO : sẽ chỉ định xem ai sẽ nhận được email về những output của mỗi lệnh. Nếu không chỉ định thì output (nếu có) sẽ được gửi đến người sở hữu tiến trình mà tạo ra output đó, tức là người lập ra lịch chạy của cron.
- HOME : là thư mục home được sử dụng cho cron. Nếu không khai báo thì mặc định là thư mục trong file /etc/passwd
Demo thực tế
Như ở bài trước, tôi đã giới thiệu cách dùng bash shell để update cơ sở dữ liệu. Vậy bài này tôi sẽ kết hợp luôn để dùng cho một tình huống như sau : Giả sử một công ty có trang web giới thiệu, trên đó có phần nhân viên mới chính thức gia nhập công ty của tháng kèm ảnh nhân viên nhưng không phải ở dạng profile. Và một web nội bộ khác để quản lý profile nhân viên công ty với ảnh dạng ảnh thẻ. Do đó, hai web dùng nguồn ảnh từ 2 DB khác nhau. Vậy giờ mỗi khi có nhân viên mới thì người quản lý sẽ phải thực hiện upload ảnh cho từng người trên từng web một, nếu con số nhân viên là hàng chục thì cũng nhiều. Vậy tại sao không đơn giản hoá bằng cách chỉ cần bảo designer nhét ảnh vào thư mục chỉ định trước nào đó trước ngày 5 hàng tháng, mỗi ảnh tương ứng một nhân viên được đánh mã sẵn ở tên ảnh. Đến 12h30 ngày 5 hàng tháng sẽ quét ảnh và cập nhật chúng vào DB.
30 * 5 * * /home/myname/bash/updatEmpImg.sh
Đến đây tôi đã trình bày xong cơ bản về Cron, tùy vào tình huống thực tế yêu cầu mà bạn có thể tìm hiểu thêm sâu hơn để ứng dụng được. Ở bài sau tôi sẽ đưa ra một vài case có thể sẽ thường gặp để làm ví dụ thực hành cho bài này.
All rights reserved