Tác vụ theo lịch là lệnh được máy chủ tự chạy vào giờ đã hẹn: gửi bản tin, dọn tệp tạm, sao lưu cơ sở dữ liệu, chạy hàng đợi của website. Bài này nói cách đặt và những chỗ dễ sai.
1. Đường vào
Advanced Features → Cron Jobs.
Bảng liệt kê các tác vụ đang có, với sáu cột: Minute, Hour, Day of Month, Month, Day of Week, và Command.
Nút CREATE CRON JOB để thêm. Nút SEND ALL CRON OUTPUT TO E-MAIL quyết định kết quả chạy có được gửi vào hộp thư hay không, xem mục 5.
2. Năm ô thời gian
| Ô | Khoảng giá trị |
|---|---|
| Minute | 0 tới 59 |
| Hour | 0 tới 23 |
| Day of Month | 1 tới 31 |
| Month | 1 tới 12 |
| Day of Week | 0 tới 6, với 0 là Chủ nhật |
Các ký hiệu dùng được trong mỗi ô:
| Ký hiệu | Nghĩa | Ví dụ |
|---|---|---|
* |
Mọi giá trị | * ở ô giờ nghĩa là mọi giờ |
| Số | Đúng giá trị đó | 30 ở ô phút |
a,b |
Nhiều giá trị | 0,30 ở ô phút: phút 0 và phút 30 |
a-b |
Một khoảng | 9-17 ở ô giờ: từ 9 giờ tới 17 giờ |
*/n |
Cứ mỗi n đơn vị | */15 ở ô phút: mỗi 15 phút |
Vài lịch thường dùng
| Muốn chạy | Minute | Hour | Day of Month | Month | Day of Week |
|---|---|---|---|---|---|
| Mỗi 5 phút | */5 |
* |
* |
* |
* |
| Mỗi giờ, vào phút 0 | 0 |
* |
* |
* |
* |
| Mỗi ngày lúc 2 giờ sáng | 0 |
2 |
* |
* |
* |
| Mỗi thứ Hai lúc 3 giờ sáng | 0 |
3 |
* |
* |
1 |
| Ngày 1 hằng tháng lúc 1 giờ | 0 |
1 |
1 |
* |
* |
⚠️ Chỗ sai kinh điển: để ô Minute là *. Đặt * ở phút và 2 ở giờ nghĩa là chạy 60 lần trong khoảng 2 giờ tới 3 giờ, chứ không phải một lần lúc 2 giờ. Muốn chạy một lần thì ô phút phải là một con số cụ thể.
3. Ô Command
Đây là lệnh được chạy. Hai dạng hay dùng nhất:
a. Gọi một tệp PHP bằng dòng lệnh:
/usr/local/bin/php /home/<ten-tai-khoan>/domains/<ten-mien>/public_html/script.php
b. Gọi một địa chỉ web:
/usr/bin/curl -s https://<ten-mien>/duong-dan-can-goi > /dev/null
Ba quy tắc cho ô này
Dùng đường dẫn tuyệt đối cho mọi thứ. Tác vụ theo lịch chạy trong một môi trường rất tối giản, không có các biến đường dẫn như khi quý Khách hàng gõ lệnh. Viết php script.php thường không chạy; phải viết đủ /usr/local/bin/php /duong/dan/day/du/script.php.
Kiểm đường dẫn PHP trước. Đường dẫn có thể khác tuỳ máy chủ. Nếu có quyền SSH, chạy which php để biết chính xác.
Thêm > /dev/null khi không cần kết quả. Xem mục 5 về lý do.
4. Giờ của máy chủ, không phải giờ của quý Khách hàng
Lịch chạy theo giờ của máy chủ. Nếu máy chủ để giờ UTC thì 0 2 * * * là 2 giờ sáng UTC, tức 9 giờ sáng giờ Việt Nam.
Kiểm giờ máy chủ bằng cách đặt một tác vụ thử chạy mỗi 5 phút ghi thời gian ra một tệp, rồi so với đồng hồ của mình. Hoặc hỏi Cloudzone qua khung chat, nhanh hơn.
Đặt một tác vụ nặng vào “2 giờ sáng” mà hoá ra nó chạy vào 9 giờ sáng giờ Việt Nam là tự làm chậm website vào đúng giờ cao điểm.
5. Kết quả chạy đi đâu
Theo mặc định, mọi thứ tác vụ in ra được gửi vào hộp thư. Nút SEND ALL CRON OUTPUT TO E-MAIL bật tắt việc này.
Đây là chỗ cân nhắc thật:
| Cách | Được | Mất |
|---|---|---|
| Bật gửi thư | Biết ngay khi tác vụ lỗi | Một tác vụ chạy mỗi 5 phút mà in ra gì đó là 288 thư mỗi ngày |
| Tắt gửi thư | Hộp thư sạch | Tác vụ hỏng mà không ai biết, có khi hàng tháng |
Cách làm hợp lý hơn cả hai: bật gửi thư, nhưng trong ô Command thêm > /dev/null để bỏ phần in ra bình thường, chỉ còn lỗi mới được gửi:
/usr/local/bin/php /duong/dan/script.php > /dev/null
Như vậy chạy đúng thì im lặng, chạy lỗi thì có thư. Đây là cách nên dùng.
Muốn im lặng hoàn toàn thì dùng > /dev/null 2>&1, nhưng khi đó lỗi cũng bị giấu, nên chỉ dùng khi tác vụ tự ghi nhật ký riêng.
6. Kiểm tác vụ có chạy không
Đặt xong, đừng tin là nó chạy. Cách kiểm chắc nhất:
- Tạm đổi lịch thành
*/5 * * * *để nó chạy mỗi 5 phút. - Thêm vào cuối lệnh phần ghi nhật ký:
/usr/local/bin/php /duong/dan/script.php >> /home/<ten-tai-khoan>/cron-thu.log 2>&1
- Chờ 10 phút rồi mở tệp
cron-thu.logbằng File Manager. - Chạy đúng thì đổi lịch về giờ thật và bỏ phần ghi nhật ký thử.
Tệp nhật ký trống sau 10 phút nghĩa là tác vụ không chạy: kiểm lại đường dẫn tuyệt đối trước.
Tệp có nội dung nhưng là thông báo lỗi nghĩa là tác vụ chạy nhưng lệnh sai: đọc thông báo đó.
7. Ba việc nên và không nên
| Nên | Không nên |
|---|---|
| Đặt các tác vụ nặng vào giờ ít người truy cập | Đặt nhiều tác vụ nặng cùng một mốc giờ |
| Mỗi tác vụ một dòng, tên lệnh rõ nghĩa | Nhồi nhiều lệnh vào một dòng bằng dấu chấm phẩy |
| Ghi lại tác vụ nào làm gì, ở đâu đó ngoài DirectAdmin | Để người sau đoán từ đường dẫn |
| Rà lại danh sách mỗi sáu tháng | Để tác vụ của một website đã gỡ vẫn chạy hằng ngày |
Hàng cuối đáng chú ý: tác vụ trỏ tới một tệp không còn tồn tại vẫn chạy và vẫn sinh lỗi, mỗi lần một thư, cho tới khi có người để ý.
8. Dùng cho việc sao lưu
Một cách dùng rất đáng giá: tự động kết xuất cơ sở dữ liệu mỗi đêm.
/usr/bin/mysqldump --single-transaction -u <nguoi-dung> -p<mat-khau> <ten-co-so-du-lieu> | gzip > /home/<ten-tai-khoan>/backups/db-$(date +\%F).sql.gz
Vài điểm cần biết:
- Dấu
%phải được thoát thành\%trong ô Command, nếu không phần sau nó bị cắt. Đây là chỗ sai rất hay gặp. - Lệnh này đặt mật khẩu ngay trong dòng lệnh, nên dòng lệnh đó ai xem được danh sách tác vụ cũng đọc được. Chấp nhận được trên tài khoản của riêng mình, không nên dùng trên tài khoản nhiều người cùng truy cập.
- Phải có một tác vụ khác dọn bản cũ, nếu không thư mục phình dần cho tới khi hết dung lượng.
Và nhắc lại điều quan trọng nhất về sao lưu: bản nằm trên chính máy chủ không bảo vệ khỏi sự cố máy chủ. Vẫn phải tải về định kỳ.
9. Khi cần hỗ trợ
Tác vụ không chạy, hãy làm bước kiểm ở mục 6 trước rồi nhắn qua khung chat ở góc phải màn hình kèm: nguyên văn ô Command, lịch đã đặt, và nội dung tệp nhật ký thử.
Đừng gửi lệnh có chứa mật khẩu qua chat. Thay phần mật khẩu bằng dấu ba chấm trước khi gửi.