คำอธิบายคำสั่ง 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
[email protected]
*/5 * * * * /home/user/scripts/backup.shSystem 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 * * * *— 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