# คำอธิบายคำสั่ง crontab

Cron daemon (crond) เป็นบริการพื้นหลังบนระบบปฏิบัติการ Unix-like ที่ดำเนินการคำสั่งตามกำหนดเวลา มันอ่านการกำหนดค่าจากไฟล์ crontab (ตาราง cron) ซึ่งกำหนดว่าแต่ละคำสั่งควรรันเมื่อไหร่และบ่อยแค่ไหน

## ไวยากรณ์

คำสั่ง crontab จัดการไฟล์ crontab ของผู้ใช้แต่ละคน:

```
crontab [-u user] [-l | -r | -e | -i] [file]
```

## ตัวเลือก

- **`-e`**: แก้ไข crontab ของผู้ใช้ปัจจุบันในตัวแก้ไขเริ่มต้น ($VISUAL หรือ $EDITOR) crontab ใหม่จะถูกติดตั้งหลังจากปิดตัวแก้ไข
- **`-l`**: แสดง crontab ของผู้ใช้ปัจจุบันไปยัง standard output
- **`-r`**: ลบ crontab ของผู้ใช้ปัจจุบันทั้งหมด
- **`-i`**: ขอการยืนยันก่อนลบ (ใช้ร่วมกับ -r)
- **`-u user`**: ดำเนินการกับ crontab ของผู้ใช้ที่ระบุแทนของตนเอง ต้องมีสิทธิ์ root
- **`file`**: ติดตั้ง crontab จากไฟล์ที่กำหนด ใช้ - สำหรับ standard input

## รูปแบบไฟล์ crontab

แต่ละบรรทัดในไฟล์ crontab เป็นการกำหนดค่าตัวแปรสภาพแวดล้อม คอมเมนต์ (เริ่มต้นด้วย #) หรืองาน cron ในรูปแบบนี้:

```
┌───────────── นาที (0–59)
│ ┌───────────── ชั่วโมง (0–23)
│ │ ┌───────────── วันในเดือน (1–31)
│ │ │ ┌───────────── เดือน (1–12 หรือ JAN–DEC)
│ │ │ │ ┌───────────── วันในสัปดาห์ (0–6 หรือ SUN–SAT)
│ │ │ │ │
* * * * *  คำสั่งที่จะดำเนินการ
```

## ตัวดำเนินการฟิลด์

- *** (asterisk)**: ตรงกับทุกค่าที่เป็นไปได้สำหรับฟิลด์นั้น
- **, (comma)**: ระบุรายการค่า ตัวอย่าง: 1,15 ในฟิลด์วันในเดือนหมายถึงวันที่ 1 และ 15
- **- (hyphen)**: กำหนดช่วงแบบรวม ตัวอย่าง: 9-17 ในฟิลด์ชั่วโมงหมายถึงทุกชั่วโมงตั้งแต่ 9 ถึง 17
- **/ (slash)**: กำหนดสเต็ป ตัวอย่าง: */10 ในฟิลด์นาทีหมายถึงทุก 10 นาที สามารถรวมกับช่วงได้: 1-30/5

## สตริงพิเศษ

แทนที่จะใช้ห้าฟิลด์เวลา คุณสามารถใช้สตริงย่อเหล่านี้ได้:

| 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` |

## ตัวแปรสภาพแวดล้อม

คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมที่ด้านบนของไฟล์ crontab ตัวแปรที่พบบ่อยที่สุด:

- **SHELL**: เชลล์ที่ใช้รันคำสั่ง (ค่าเริ่มต้น: /bin/sh)
- **PATH**: เส้นทางค้นหาคำสั่ง PATH เริ่มต้นของ cron มีน้อยมาก (ปกติคือ /usr/bin:/bin) ดังนั้นควรใช้เส้นทางแบบสัมบูรณ์หรือตั้งค่า PATH อย่างชัดเจน
- **MAILTO**: ที่ส่งผลลัพธ์ของคำสั่ง ตั้งค่าเป็น "" เพื่อปิดอีเมล โดยค่าเริ่มต้น ผลลัพธ์จะถูกส่งทางอีเมลไปยังเจ้าของ crontab
- **CRON_TZ**: ตั้งค่าเขตเวลาสำหรับ crontab (ไม่รองรับในทุกระบบ) หากไม่ตั้ง cron จะใช้เขตเวลาของระบบ

```
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com

*/5 * * * * /home/user/scripts/backup.sh
```

## System crontab เทียบกับ user crontab

User crontab (แก้ไขด้วย crontab -e) มีห้าฟิลด์เวลาบวกคำสั่ง System crontab (/etc/crontab) และไฟล์ใน /etc/cron.d/ มีฟิลด์เพิ่มเติมระหว่างฟิลด์เวลาและคำสั่ง: ชื่อผู้ใช้ที่คำสั่งรันภายใต้

ตัวอย่าง system crontab:

```
# /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
```

## ข้อผิดพลาดที่พบบ่อย

### % (percent sign)

เครื่องหมายเปอร์เซ็นต์ (%) มีความหมายพิเศษใน crontab: มันถูกแปลงเป็นบรรทัดใหม่ และทุกอย่างหลัง % แรกจะถูกส่งเป็น standard input ไปยังคำสั่ง หากต้องการใช้ % จริง ให้ escape เป็น \%

```
# 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 รันด้วย PATH ที่น้อยมาก สคริปต์ที่ต้องการคำสั่งจาก /usr/local/bin หรือไดเร็กทอรีอื่นควรใช้เส้นทางแบบสัมบูรณ์หรือตั้งค่า PATH ที่ด้านบนของ crontab

### Day-of-month + day-of-week

เมื่อทั้งวันในเดือนและวันในสัปดาห์ถูกจำกัด (ไม่ใช่ *) cron จะรันคำสั่งเมื่อฟิลด์ใดฟิลด์หนึ่งตรงกัน (ตรรกะ OR) ไม่ใช่เมื่อทั้งสองตรงกัน ตัวอย่าง 0 0 1 * 5 รันตอนเที่ยงคืนวันที่ 1 ของทุกเดือนและทุกวันศุกร์

### Timezone

Cron ใช้เขตเวลาของระบบโดยค่าเริ่มต้น หากเซิร์ฟเวอร์อยู่ใน UTC แต่คุณต้องการงานในเขตเวลาท้องถิ่น ให้ใช้ CRON_TZ (ที่รองรับ) หรือแปลงเวลาด้วยตนเอง

### Output and logging

โดยค่าเริ่มต้น cron จะส่งผลลัพธ์ทั้งหมด (stdout และ stderr) ทางอีเมลไปยังเจ้าของ crontab หากต้องการปิดเสียง ให้เปลี่ยนทิศทางผลลัพธ์: command > /dev/null 2>&1 หากต้องการบันทึกผลลัพธ์ ให้เปลี่ยนทิศทางไปยังไฟล์: 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
```

## ตัวอย่างเชิงปฏิบัติ

- [`*/5 * * * *`](https://crontab.run/th/every-5-minutes) — run every 5 minutes
- [`0 0 * * *`](https://crontab.run/th/daily) — run once a day at midnight
- [`0 9 * * 1-5`](https://crontab.run/th/every-weekday-at-9am) — run at 9 AM on weekdays
- [`0 0 1 * *`](https://crontab.run/th/every-month) — run at midnight on the 1st of every month
- [`0 0 * * 0`](https://crontab.run/th/every-sunday) — run at midnight every Sunday

Canonical: https://crontab.run/th/command

---

Maintained by Jsmon — https://jsmon.sh
