Sử dụng Cron Crontab tự động chạy script trên Server Linux

Giới thiệu Cron, crontab

Một chức năng giống như Microsoft Task Scheduler, nó cho phép bạn chạy các tác vụ theo một lịch biểu (có thể một lần, lặp lại nhiều lần) theo phút, giờ, ngày, tuần, tháng. Thành phần đó trong Linux là crontab (viết tắt của chronograph table). Nó dựa vào đồng hồ hệ thống xác định thời điểm phù hợp thi hành các tác vụ được cấu hình chạy. Thường sử dụng crontab để chạy các lệnh, các script nhẹ với mục đích bảo trì hệ thống, ví du như định kỳ hàng tuần xóa các file log cũ sinh ra bởi httpd, định kỳ cập nhật phần mềm …

Kiểm tra trạng thái dịch vụ cron có đang chạy không

# Trên CentOS
systemctl status crond

# Trên Ubuntu
systemctl status cron

Để dừng, chạy, khởi động lại sử dụng các lệnh: systemctl stop|start|restart crond

Kiểm tra các crontab

Các crontab (các tác vụ cần chạy theo lịch) được thiết lập chạy cho từng User, để liệt kê xem User hiện tại (đang login) có các crontab nào sử dụng lệnh sau

crontab -l

Biên tập crontab

Mặc định thì lưu trữ tại /var/spool/cron/, bạn có thể dùng các trình soạn thảo text như vim, nano vào biên tập – thêm bớt các tác vụ cần chạy theo lịch

Hoặc vào ngay soạn thảo các crontab cho user hiện tại bằng lệnh:

crontab -e

Ở màn hình soạn thảo, bạn biên tập các dòng crontab theo cấu trúc trình bày phần dưới, sau đó lưu lại và thoát ra, nếu cú pháp khai báo không có lỗi gì thì các crontab được cài đặt và lên lịch thực hiện

Tìm hiểu định dạng các dòng Crontab

Mỗi dòng crontab có định lưu các số liệu sau:

*****script
phút
1 - 59
giờ
0 - 23
ngày
1 - 31
tháng
1 - 12
thứ
0 - 7
0=chủ nhật
7=thứ bảy
lệnh hoặc script được chạy
*[phút]  *[giờ]  *[ngày trong tháng]  *[tháng]  *[thứ]  [lệnh chạy (script hoặc lệnh linux)]

Vậy mỗi dòng thường có 6 cột dữ liệu, 5 cột đầu để xác định thời điểm chạy (thời gian). Cột thứ 6 là lệnh chạy (thường là một script).

Các cột thời gian, loại thời gian nào luôn xảy ra để dấu * (ví dụ mọi phút thì cột phút để dấu *, mọi giờ thì cột giờ để *, mọi ngày thì cột ngày để * ….) còn muốn xảy ra ở một thời điểm cụ thể thì điền thời điểm đó vào.

Ví dụ: Cứ đến phút 30 hàng giờ thì chạy script tên là /script/abc.sh thì cấu trúc như sau:

Điền số 30 vào cột phút, các cột giờ, ngày, tháng, thứ điền * vì xảy ra mọi giờ, mọi ngày, mọi tháng. Vậy dòng crontab phù hợp như sau:

30 * * * *  /script/abc.sh

Tương tự như vậy xem một số ví dụ sau:

#Chạy vào lúc 3 giờ hàng ngày
0 3 * * *  /script/abc.sh
#Chạy vào lúc 17h ngày chủ nhật hàng tuần
0 17 * * sun /scripts/abc.sh
#Cứ 8 tiếng là chạy
0 */8 * * * /scripts/abc.sh
#Cứ 30 phút chạy một lần
*/30 * * * * /script/abc.sh

Ngoài ra còn một số dạng tắt:

Chạy hàng tháng

@monthly /scripts/abc.sh

Chạy hàng tuần

@weekly /bin/script.sh

Chạy hàng ngày

@daily /scripts/script.sh

Ví dụ về Crontab

Kiểm tra database và tự sửa chữa.

Mysql nhiều khi bị crash database và cần repair, tạo một script làm việc này và chạy vào 3h sáng hàng ngày.

Làm như sau:

Tạo một script tên là rpairdb.sh với nội dung như sau

#!/bin/bash
mysqlcheck -u{username}  -p{password} --auto-repair --check --all-databases

Trong đó {username} : điền tài khoản admin của mysql; {password} thay bàng password.

Sau đó gõ lệnh

crontab -e

Thêm vào một dòng với nội dung

*    3    *    *    *    /rpairdb.sh

Lưu lại là xong.

Cứ 30 phút là chạy một script trong file .php

Giả sử bạn có file PHP, lưu tại /home/user/run30.php, trong đó có các code php mà bạn muốn chạy cứ 30 phút một lần bạn làm tương tự như trên và thêm vào crontab

*/30    *    *    *    *    php /home/user/run30.php

Leave a Reply