# Cron Tham Khảo Nhanh

*Lập lịch job, cú pháp crontab, chuỗi đặc biệt, logging*

> Source: crontab(5) Manual Page · MIT

## Cú Pháp

### Định Dạng Crontab

```
# ┌───── phút (0-59)
# │ ┌───── giờ (0-23)
# │ │ ┌───── ngày trong tháng (1-31)
# │ │ │ ┌───── tháng (1-12)
# │ │ │ │ ┌───── ngày trong tuần (0-7, 0&7=CN)
# * * * * * lệnh
```

### Giá Trị Trường

| Command | Description |
|---------|-------------|
| `*` | Bất kỳ giá trị nào (wildcard) |
| `,` | Danh sách giá trị: `1,3,5` |
| `-` | Phạm vi: `1-5` |
| `/` | Bước: `*/10` (mỗi 10 đơn vị) |
| `0-59` | Phạm vi phút |
| `0-23` | Phạm vi giờ |
| `1-31` | Phạm vi ngày trong tháng |
| `1-12` | Phạm vi tháng (hoặc JAN-DEC) |
| `0-7` | Ngày trong tuần (0&7=CN, hoặc SUN-SAT) |

## Chuỗi Đặc Biệt

### Lịch Rút Gọn

| Command | Description |
|---------|-------------|
| `@reboot` | Chạy một lần khi khởi động |
| `@yearly` | `0 0 1 1 *` — mỗi năm một lần (1/1) |
| `@monthly` | `0 0 1 * *` — mỗi tháng một lần (ngày 1) |
| `@weekly` | `0 0 * * 0` — mỗi tuần một lần (Chủ nhật) |
| `@daily` | `0 0 * * *` — mỗi ngày một lần (nửa đêm) |
| `@hourly` | `0 * * * *` — mỗi giờ một lần |

## Ví Dụ

### Lịch Thường Dùng

```
30 2 * * *   /usr/local/bin/backup.sh
0 9 * * 1-5  /opt/report.sh
*/15 * * * *  /usr/bin/health-check.sh
0 0 1 * *    /opt/monthly-cleanup.sh
0 8,17 * * * /opt/notify.sh
```

### Giải Thích Lịch

| Command | Description |
|---------|-------------|
| `30 2 * * *` | Hằng ngày lúc 2:30 sáng |
| `0 9 * * 1-5` | Các ngày thường lúc 9:00 sáng |
| `*/15 * * * *` | Mỗi 15 phút |
| `0 0 1 * *` | Ngày đầu tháng, nửa đêm |
| `0 8,17 * * *` | Hằng ngày lúc 8 giờ sáng và 5 giờ chiều |

## Môi Trường

### Đặt Biến

```
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com
HOME=/home/deploy
* * * * * /opt/myjob.sh
```

### Ghi Chú Môi Trường

| Command | Description |
|---------|-------------|
| `SHELL` | Shell chạy lệnh (mặc định `/bin/sh`) |
| `PATH` | Đường dẫn tìm kiếm (mặc định cron rất tối giản) |
| `MAILTO` | Gửi đầu ra đến địa chỉ này (rỗng = không gửi) |
| `HOME` | Thư mục home cho cron job |

## Logging

### Đầu Ra & Logging

```
# chuyển hướng stdout + stderr vào file log
*/5 * * * * /opt/job.sh >> /var/log/job.log 2>&1
# bỏ qua tất cả đầu ra
0 3 * * * /opt/job.sh > /dev/null 2>&1
# chỉ log lỗi
0 3 * * * /opt/job.sh > /dev/null 2>> /var/log/job-err.log
```

### Xem Log Cron

```
# Debian / Ubuntu (syslog)
grep CRON /var/log/syslog
# RHEL / CentOS
cat /var/log/cron
# journalctl (systemd)
journalctl -u cron --since "1 hour ago"
```

## Lịch Thường Dùng

### Pattern Hằng Ngày

| Command | Description |
|---------|-------------|
| `0 * * * *` | Mỗi giờ đúng giờ |
| `*/5 * * * *` | Mỗi 5 phút |
| `*/30 * * * *` | Mỗi 30 phút |
| `0 0 * * *` | Hằng ngày lúc nửa đêm |
| `0 6 * * 1` | Mỗi thứ Hai lúc 6 giờ sáng |
| `0 0 1,15 * *` | Ngày 1 và 15 hằng tháng |
| `0 0 * * 5` | Mỗi thứ Sáu lúc nửa đêm |
| `0 0 1 1 *` | Mỗi ngày 1 tháng 1 |

## Lệnh crontab

### Quản Lý Crontab

```
crontab -e               # chỉnh sửa crontab của bạn
crontab -l               # liệt kê crontab của bạn
crontab -r               # xóa crontab của bạn
crontab -u alice -l      # liệt kê crontab của người dùng khác (root)
crontab /path/to/file    # cài crontab từ file
```

### Vị Trí Crontab Hệ Thống

| Command | Description |
|---------|-------------|
| `/etc/crontab` | Crontab toàn hệ thống (có trường user) |
| `/etc/cron.d/` | File cron drop-in |
| `/etc/cron.daily/` | Script chạy hằng ngày |
| `/etc/cron.hourly/` | Script chạy hằng giờ |
| `/etc/cron.weekly/` | Script chạy hằng tuần |
| `/etc/cron.monthly/` | Script chạy hằng tháng |
| `/var/spool/cron/` | Lưu trữ crontab theo từng người dùng |

## Mẹo

### Best Practices

| Command | Description |
|---------|-------------|
| `Dùng đường dẫn tuyệt đối` | PATH của cron tối giản; luôn dùng đường dẫn đầy đủ |
| `Chuyển hướng đầu ra` | Tránh spam mail với `> /dev/null 2>&1` |
| `Lock files` | Dùng `flock` để ngăn chạy chồng chéo |
| `Kiểm tra trước` | Chạy lệnh thủ công trước khi lên lịch |
| `Dùng MAILTO` | Đặt `MAILTO=""` để tắt tất cả email |
| `Kiểm tra timezone` | Cron dùng giờ hệ thống; xác minh bằng `date` |

### Ngăn Chồng Chéo với flock

```
# chỉ chạy nếu chưa đang chạy
* * * * * /usr/bin/flock -n /tmp/job.lock /opt/job.sh
```
