
Cron Job คือการตั้งเวลาให้ระบบรันสคริปต์หรือคำสั่งโดยอัตโนมัติตามช่วงเวลาที่กำหนด เหมาะสำหรับ: ส่งอีเมลอัตโนมัติ, สร้าง Backup, อัปเดตข้อมูล, ลบไฟล์ชั่วคราว
วิธีเพิ่ม Cron Job
- ล็อกอิน DirectAdmin แล้วไปที่ Advanced Features
- คลิก Cron Jobs
- คลิก Add New Cron Job
- กรอก Cron Expression และ Command
- คลิก Add
ทำความเข้าใจ Cron Syntax
รูปแบบ Cron ประกอบด้วย 5 ช่อง: นาที ชั่วโมง วันที่ เดือน วันในสัปดาห์
* * * * *— ทุกนาที0 * * * *— ทุกชั่วโมง (ที่นาทีที่ 0)0 2 * * *— ทุกคืนเวลา 02:00 น.0 2 * * 0— ทุกวันอาทิตย์เวลา 02:00 น.0 2 1 * *— วันที่ 1 ของทุกเดือน เวลา 02:00 น.
ตัวอย่าง Cron Jobs ที่ใช้บ่อย
รัน PHP Script ทุกชั่วโมง:
/usr/bin/php /home/username/public_html/cron.php
รัน WordPress WP-Cron ทุก 5 นาที:
*/5 * * * * /usr/bin/php /home/username/public_html/wp-cron.php
เคล็ดลับ: ใช้ /usr/bin/php แทน php เสมอเพื่อให้ Cron หาโปรแกรมเจอ และตรวจสอบ Email ที่ตั้งใน DirectAdmin เพราะ Cron จะส่ง Output ไปที่ Email ทุกครั้งที่รัน (ตั้ง MAILTO="" เพื่อปิด)
Cron Job คืออะไรและใช้งานได้กับอะไรบ้าง
Cron Job มาจากชื่อ cron daemon ซึ่งเป็นกระบวนการที่ทำงานอยู่เบื้องหลังบนเซิร์ฟเวอร์ Linux/Unix ตลอดเวลา หน้าที่ของมันคือตรวจสอบตาราง cron ทุก 1 นาที และเมื่อเวลาตรงกับกำหนด ระบบจะเรียกคำสั่งหรือสคริปต์ที่ตั้งไว้ให้ทำงานอัตโนมัติโดยไม่ต้องมีคนกดปุ่ม
งานที่นิยมใช้ Cron Job ในการโฮสติ้งได้แก่:
- Scheduled Backup — สำรองข้อมูลฐานข้อมูลและไฟล์เว็บไซต์รายวันหรือรายสัปดาห์โดยอัตโนมัติ
- Cleanup งาน — ลบไฟล์ชั่วคราว, Session ที่หมดอายุ, Log ที่เก่าเกิน 30 วัน
- Email Newsletter — ส่งอีเมลแจ้งเตือนหรือ Newsletter ตามเวลาที่กำหนดทุกสัปดาห์
- อัปเดตข้อมูล — ดึงข้อมูล RSS, ราคาสินค้า, อัตราแลกเปลี่ยน มาอัปเดตในฐานข้อมูลเป็นประจำ
- Sitemap Generator — สร้างหรืออัปเดต sitemap.xml ใหม่ทุกคืนเพื่อให้ Search Engine ได้รับข้อมูลล่าสุด
- WordPress WP-Cron — แทนที่ Virtual Cron ของ WordPress ด้วย Cron จริงเพื่อให้ Scheduled Post และ Plugin Task ทำงานได้ตรงเวลา
- Monitoring Script — ตรวจสอบสถานะเว็บไซต์และส่งแจ้งเตือนเมื่อระบบผิดปกติ
ข้อดีของ Cron คือทำงานได้แม้ไม่มีใคร Login เข้าเว็บไซต์ และรันได้ทุกวันตลอด 24 ชั่วโมงโดยไม่ต้องอาศัยผู้เยี่ยมชมมากระตุ้น ต่างจาก WordPress WP-Cron ที่ต้องรอให้มีคนเข้าเว็บก่อน
อ่านและเขียน Cron Expression ให้ถูกต้อง
Cron Expression ประกอบด้วย 5 ช่องข้อมูลเรียงติดกัน คั่นด้วยช่องว่าง แต่ละช่องควบคุมมิติเวลาที่แตกต่างกัน ก่อนใส่ค่าใดๆ ต้องเข้าใจความหมายของแต่ละตำแหน่งก่อน:
- ช่องที่ 1 — นาที (0–59): กำหนดนาทีที่ต้องการรัน เช่น
30= นาทีที่ 30,*/15= ทุก 15 นาที - ช่องที่ 2 — ชั่วโมง (0–23): กำหนดชั่วโมงแบบ 24 ชม. เช่น
2= 02:00 น.,*/2= ทุก 2 ชั่วโมง - ช่องที่ 3 — วันที่ (1–31): กำหนดวันที่ในเดือน เช่น
1= วันที่ 1 ของเดือน,*= ทุกวัน - ช่องที่ 4 — เดือน (1–12): กำหนดเดือน เช่น
1= มกราคม,*= ทุกเดือน - ช่องที่ 5 — วันในสัปดาห์ (0–7): 0 และ 7 = วันอาทิตย์, 1 = จันทร์, ... 6 = เสาร์
สัญลักษณ์พิเศษที่ควรรู้
*— ทุกค่าในช่องนั้น เช่น* * * * *= รันทุกนาที/— ช่วงห่าง เช่น*/5= ทุก 5 หน่วย-— ช่วง เช่น1-5ในช่องวันสัปดาห์ = วันจันทร์ถึงศุกร์,— หลายค่า เช่น0,12ในช่องชั่วโมง = ทุกเที่ยงคืนและเที่ยงวัน
ตัวอย่างที่ใช้บ่อย
0 3 * * *— รันทุกวันเวลา 03:00 น. (เหมาะสำหรับ Backup กลางดึก)0 3 * * 0— รันเฉพาะวันอาทิตย์เวลา 03:00 น.*/30 * * * *— รันทุก 30 นาที0 8 1 * *— รันวันที่ 1 ของทุกเดือนเวลา 08:00 น.0 8-18 * * 1-5— รันทุกชั่วโมง ช่วง 08:00–18:00 น. เฉพาะวันทำงาน
การ Debug Cron Job ที่ไม่รัน
หนึ่งในปัญหาที่พบบ่อยที่สุดคือตั้ง Cron ไว้แล้วแต่ดูเหมือนไม่มีอะไรเกิดขึ้น สาเหตุส่วนใหญ่มาจากสิ่งเหล่านี้:
1. ปัญหา PATH Environment
เมื่อ Cron รันคำสั่ง ระบบไม่ได้โหลด Shell Environment เหมือนตอนที่คุณ Login ผ่าน SSH ดังนั้นตัวแปร PATH ที่กำหนดใน .bashrc หรือ .bash_profile จะไม่มีผล คำสั่ง php, python3, mysql จะหาไม่เจอ ต้องระบุ full path เสมอ:
- PHP:
/usr/bin/phpหรือ/usr/local/bin/php - Python:
/usr/bin/python3 - MySQL:
/usr/bin/mysql - หา path จริง: SSH เข้าแล้วรัน
which php
2. Redirect Output เพื่อดู Error
Cron ไม่แสดง output บนหน้าจอ ถ้าสคริปต์มี error คุณจะไม่เห็นอะไรเลยหากไม่ redirect output ออกมา ให้เพิ่ม redirect ต่อท้าย command:
/usr/bin/php /home/user/public_html/cron.php >> /tmp/mycron.log 2>&1
>> หมายถึง append ต่อท้าย log file และ 2>&1 หมายถึงให้ error output ไปที่เดียวกับ standard output เมื่อ Cron รันแล้ว ให้เปิดไฟล์ /tmp/mycron.log ผ่าน File Manager เพื่อดูว่าเกิดอะไรขึ้น
3. Permission และ Memory Limit
ตรวจสอบว่าไฟล์สคริปต์มีสิทธิ์ Execute (chmod 644 หรือ 755) และค่า memory limit ใน PHP ไม่เกินที่ Hosting กำหนด สคริปต์ที่ใช้ memory เกินลิมิตจะหยุดกลางคันโดยไม่มี error แจ้ง
Best Practices สำหรับ Cron บน Shared Hosting
เมื่อใช้งาน Cron บน Shared Hosting มีข้อควรระวังเพิ่มเติมจาก VPS หรือ Dedicated Server เพราะทรัพยากรถูกแบ่งใช้ร่วมกัน:
ใช้ PHP Path ที่ถูกต้อง
บน Shared Hosting DirectAdmin มักมี PHP หลายเวอร์ชันพร้อมกัน เช่น /usr/bin/php74, /usr/bin/php81, /usr/bin/php83 ควรระบุเวอร์ชันให้ตรงกับที่เว็บไซต์ใช้ เพราะถ้าเรียก php เฉยๆ อาจได้เวอร์ชัน default ที่ต่างจาก PHP ที่เว็บใช้อยู่ ทำให้เกิด error
ป้องกัน Cron ซ้อนกัน (Overlap)
ถ้าสคริปต์ใช้เวลานานกว่า Interval ที่ตั้ง เช่น ตั้งให้รันทุก 5 นาที แต่สคริปต์ใช้เวลา 8 นาที จะเกิด Cron ซ้อนกัน 2 instance ทำให้โหลดเซิร์ฟเวอร์พุ่ง แก้โดยใช้ File Lock หรือ PID file ในสคริปต์เพื่อป้องกันการรันซ้ำ
ตั้ง Memory Limit และ Time Limit
ใส่ค่า limit ไว้ต้นสคริปต์ PHP เพื่อป้องกันการใช้ทรัพยากรเกิน:
ini_set('memory_limit', '128M');
set_time_limit(300);
ปิด Email Output หลังทดสอบผ่านแล้ว
ตอนทดสอบ Cron ใหม่ ให้ตั้ง Email Output ไว้รับ error แต่เมื่อมั่นใจแล้วว่าทำงานถูกต้อง ควรปิด Email ด้วย MAILTO="" ต้นบรรทัด command หรือ redirect output ไปที่ /dev/null เพื่อไม่ให้กล่อง Email เต็มจากการรันทุกวัน
หลีกเลี่ยงการรัน Cron บ่อยเกินไป
บน Shared Hosting ไม่ควรตั้ง Cron ให้รันถี่กว่าทุก 5 นาที เพราะอาจกระทบ User อื่นบนเซิร์ฟเวอร์เดียวกัน หากต้องการ Task ที่รันถี่มาก เช่น ทุกนาที ควรพิจารณาอัปเกรดเป็น VPS เพื่อให้มีทรัพยากรเป็นของตัวเอง
ตัวอย่าง Cron Job สำหรับงาน Hosting ทั่วไป
เมื่อเข้าใจ Cron Syntax และ Best Practices แล้ว ตัวอย่างต่อไปนี้เป็น Command จริงที่ใช้งานได้บน DirectAdmin Hosting ครอบคลุมงานประจำที่เว็บมาสเตอร์ต้องการทำอัตโนมัติมากที่สุด:
Weekly Backup — สำรองข้อมูลทุกสัปดาห์
รันทุกวันอาทิตย์เวลา 02:30 น. เพื่อสำรอง MySQL database:
30 2 * * 0 /usr/bin/mysqldump -u username -p'password' dbname >> /home/username/backups/db-backup.sql
Daily Log Cleanup — ลบ Log ไฟล์เก่าทุกวัน
รันทุกคืนเพื่อลบไฟล์ Log ที่เก่ากว่า 30 วันในโฟลเดอร์ logs/:
0 3 * * * /usr/bin/find /home/username/public_html/logs/ -name "*.log" -mtime +30 -delete
Cache Purge — ล้าง Cache ทุก 6 ชั่วโมง
รัน PHP script เพื่อลบไฟล์ Cache ที่หมดอายุแล้วทุก 6 ชั่วโมง:
0 */6 * * * /usr/bin/php /home/username/public_html/scripts/clear-cache.php
Sitemap Regenerate — อัปเดต Sitemap ทุกคืน
รันทุกคืนเวลา 01:00 น. เพื่อสร้าง sitemap.xml ใหม่จากฐานข้อมูล:
0 1 * * * /usr/bin/php /home/username/public_html/sitemap-generate.php >> /tmp/sitemap.log 2>&1
การตั้ง Cron แต่ละตัวให้ทำงานในช่วงเวลาที่ต่างกัน (02:30, 03:00, 06:00, 01:00) ช่วยกระจาย Load บนเซิร์ฟเวอร์ ไม่ให้งานหลาย Task ชนกันพร้อมกันในช่วงเวลาเดียว
ต้องการ Hosting รองรับ Cron Jobs?
AsiaGB Hosting รองรับ Cron Jobs ทุกแพ็กเกจ พร้อม PHP และ DirectAdmin ใช้งานง่าย
ดูแพ็กเกจ Hosting