Giải thích lệnh crontab
Trình nền cron (crond) là một dịch vụ chạy nền trên các hệ điều hành Unix thực thi các lệnh theo lịch trình. Nó đọc cấu hình từ các file crontab (bảng cron), định nghĩa thời gian và tần suất chạy của mỗi lệnh.
Cú pháp
Lệnh crontab quản lý file crontab của từng người dùng:
crontab [-u user] [-l | -r | -e | -i] [file]Tùy chọn
- -e
- Chỉnh sửa crontab của người dùng hiện tại trong trình soạn thảo mặc định ($VISUAL hoặc $EDITOR). Crontab mới được cài đặt sau khi trình soạn thảo đóng.
- -l
- Hiển thị crontab của người dùng hiện tại ra đầu ra chuẩn.
- -r
- Xóa hoàn toàn crontab của người dùng hiện tại.
- -i
- Yêu cầu xác nhận trước khi xóa (dùng với -r).
- -u user
- Thao tác trên crontab của người dùng được chỉ định thay vì của bạn. Yêu cầu quyền root.
- file
- Cài đặt crontab từ file đã cho. Dùng - cho đầu vào chuẩn.
Định dạng file crontab
Mỗi dòng trong file crontab là một phép gán biến môi trường, một chú thích (bắt đầu bằng #), hoặc một tác vụ cron với định dạng sau:
┌───────────── phút (0–59)
│ ┌───────────── giờ (0–23)
│ │ ┌───────────── ngày trong tháng (1–31)
│ │ │ ┌───────────── tháng (1–12 hoặc JAN–DEC)
│ │ │ │ ┌───────────── ngày trong tuần (0–6 hoặc SUN–SAT)
│ │ │ │ │
* * * * * lệnh cần thực thiToán tử trường
- * (asterisk)
- Khớp với mọi giá trị có thể của trường.
- , (comma)
- Chỉ định danh sách giá trị. Ví dụ: 1,15 trong trường ngày nghĩa là ngày 1 và ngày 15.
- - (hyphen)
- Định nghĩa một phạm vi bao gồm. Ví dụ: 9-17 trong trường giờ nghĩa là mỗi giờ từ 9 đến 17.
- / (slash)
- Định nghĩa bước nhảy. Ví dụ: */10 trong trường phút nghĩa là mỗi 10 phút. Có thể kết hợp với phạm vi: 1-30/5.
Chuỗi đặc biệt
Thay vì năm trường thời gian, bạn có thể sử dụng một trong các chuỗi viết tắt sau:
| String | Equivalent |
|---|---|
@yearly / @annually | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily / @midnight | 0 0 * * * |
@hourly | 0 * * * * |
@reboot | Run once at startup |
Biến môi trường
Bạn có thể đặt biến môi trường ở đầu file crontab. Các biến phổ biến nhất:
- SHELL
- Shell dùng để chạy lệnh (mặc định: /bin/sh).
- PATH
- Đường dẫn tìm kiếm lệnh. PATH mặc định của cron rất tối thiểu (thường là /usr/bin:/bin), vì vậy hãy luôn dùng đường dẫn tuyệt đối hoặc đặt PATH rõ ràng.
- MAILTO
- Nơi gửi đầu ra lệnh. Đặt thành "" để tắt email. Mặc định, đầu ra được gửi qua email cho chủ sở hữu crontab.
- CRON_TZ
- Đặt múi giờ cho crontab (không được hỗ trợ trên tất cả hệ thống). Nếu không đặt, cron sử dụng múi giờ hệ thống.
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
[email protected]
*/5 * * * * /home/user/scripts/backup.shCrontab hệ thống và crontab người dùng
Crontab người dùng (chỉnh sửa bằng crontab -e) có năm trường thời gian cộng với lệnh. Crontab hệ thống (/etc/crontab) và các file trong /etc/cron.d/ có thêm một trường giữa các trường thời gian và lệnh: tên người dùng mà lệnh chạy dưới quyền.
Ví dụ crontab hệ thống:
# /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
*/15 * * * * root /usr/local/bin/system-check.sh
0 2 * * * backup /usr/local/bin/nightly-backup.shCác lỗi thường gặp
% (percent sign)
Ký hiệu phần trăm (%) có ý nghĩa đặc biệt trong crontab: nó được chuyển thành dòng mới, và mọi thứ sau % đầu tiên được gửi làm đầu vào chuẩn cho lệnh. Để sử dụng % theo nghĩa đen, hãy escape bằng \%.
# Wrong — the % will be interpreted
0 0 * * * echo "Date: $(date +%Y-%m-%d)"
# Correct — escape the %
0 0 * * * echo "Date: $(date +\%Y-\%m-\%d)"PATH
Cron chạy với PATH tối thiểu. Các script phụ thuộc vào lệnh trong /usr/local/bin hoặc thư mục khác nên dùng đường dẫn tuyệt đối hoặc đặt PATH ở đầu crontab.
Day-of-month + day-of-week
Khi cả ngày trong tháng và ngày trong tuần đều bị giới hạn (không phải *), cron chạy lệnh khi một trong hai trường khớp (logic OR), không phải khi cả hai khớp. Ví dụ, 0 0 1 * 5 chạy lúc nửa đêm ngày 1 mỗi tháng VÀ mỗi thứ Sáu.
Timezone
Cron sử dụng múi giờ hệ thống theo mặc định. Nếu máy chủ ở UTC nhưng bạn muốn tác vụ chạy theo múi giờ địa phương, hãy dùng CRON_TZ (nếu được hỗ trợ) hoặc chuyển đổi giờ thủ công.
Output and logging
Mặc định, cron gửi mọi đầu ra (stdout và stderr) cho chủ sở hữu crontab. Để tắt tiếng tác vụ, chuyển hướng đầu ra: command > /dev/null 2>&1. Để ghi log đầu ra, chuyển hướng vào file: command >> /var/log/myjob.log 2>&1.
# Discard all output
*/5 * * * * /path/to/script.sh > /dev/null 2>&1
# Log output to a file
*/5 * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1Ví dụ thực tế
*/5 * * * *— run every 5 minutes0 0 * * *— run once a day at midnight0 9 * * 1-5— run at 9 AM on weekdays0 0 1 * *— run at midnight on the 1st of every month0 0 * * 0— run at midnight every Sunday