crontab.run

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 thi

Toá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:

StringEquivalent
@yearly / @annually0 0 1 1 *
@monthly0 0 1 * *
@weekly0 0 * * 0
@daily / @midnight0 0 * * *
@hourly0 * * * *
@rebootRun 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.sh

Crontab 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.sh

Cá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>&1

Ví dụ thực tế