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út1 - 59 | giờ0 - 23 | ngày1 - 31 | tháng1 - 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