crontab.run

คำอธิบายคำสั่ง 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

สตริงพิเศษ

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

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

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