Cron Job คืออะไร และงานตั้งเวลาทำงานอย่างไร?

ผู้เขียน: บรรณาธิการซอฟต์แวร์ Webizmเผยแพร่: 26 ส.ค. 2569อัปเดต: 11 ก.ย. 25697 นาที

Cron job คือเครื่องมือตั้งเวลาขั้นพื้นฐานในระบบปฏิบัติการบนฐาน Unix ที่ช่วยให้สามารถรันสคริปต์และกระบวนการทำงานต่าง ๆ ได้โดยอัตโนมัติตามเวลาที่กำหนด

Featured image for Cron Job คืออะไร และงานตั้งเวลาทำงานอย่างไร?
Featured image for Cron Job คืออะไร และงานตั้งเวลาทำงานอย่างไร?

Cron job คือกลไกการตั้งเวลาในระบบปฏิบัติการบนฐาน Unix ที่ช่วยให้สคริปต์ คำสั่ง และรูทีนของระบบ ทำงานโดยอัตโนมัติในเบื้องหลังตามช่วงเวลาที่กำหนดไว้ล่วงหน้า โดยไม่จำเป็นต้องใช้มนุษย์เข้ามาควบคุมจัดการ

ในโครงสร้างพื้นฐานไอที (IT infrastructure) ยุคใหม่ ความสอดคล้องของข้อมูล วินัยในการสำรองข้อมูล และความยั่งยืนของการทำงานแบบอซิงโครนัส (asynchronous operations) ขึ้นอยู่กับความเสถียรของงานตั้งเวลาโดยตรง เมื่อสถาปัตยกรรมซอฟต์แวร์ขยายตัวขึ้น การทำงานตามรูทีน เช่น การล้างข้อมูลในฐานข้อมูล การเรียกเก็บเงินแบบกลุ่ม (bulk billing) การส่งอีเมล และการซิงโครไนซ์ API ของบุคคลที่สาม จะต้องดำเนินไปอย่างไม่มีข้อผิดพลาด ในคู่มือนี้Cron Job คืออะไร และงานตั้งเวลาทำงานอย่างไร?คุณจะได้พบกับเบื้องหลังทางเทคนิคของคำถามดังกล่าว, สถาปัตยกรรมไวยากรณ์ (syntax) ของ Crontab, แนวปฏิบัติการใช้งานที่สำคัญในระบบระดับองค์กร, การปรับแต่งทรัพยากรเซิร์ฟเวอร์ให้เหมาะสม และกลยุทธ์การจัดการข้อผิดพลาดอย่างละเอียดที่สุดในทุกแง่มุม

สถาปัตยกรรม Cron Job (งานตั้งเวลา) และแนวคิดพื้นฐาน

การทำงานอัตโนมัติในการตั้งเวลาในสถาปัตยกรรม Unix และ Linux ถือเป็นหนึ่งในความสามารถหลักของระบบปฏิบัติการ โดยงานตั้งเวลาจะทำงานบนหลักการของการทริกเกอร์ (trigger) สคริปต์เฉพาะ ไฟล์ไบนารี (binary) ที่คอมไพล์แล้ว หรือคำสั่งเชลล์ (shell command) ณ นาที ชั่วโมง วัน หรือเดือนที่กำหนดไว้ล่วงหน้า วัตถุประสงค์หลักของกระบวนการนี้คือการทำให้งานที่ต้องทำเป็นประจำซึ่งผู้ดูแลระบบที่เป็นมนุษย์ต้องคอยตรวจสอบด้วยตนเองนั้น เป็นมาตรฐานเดียวกันในระดับเลเยอร์ของระบบ เพื่อลดความเสี่ยงจากข้อผิดพลาดของมนุษย์ให้เหลือศูนย์

สำหรับผู้ดูแลระบบและวิศวกรซอฟต์แวร์ โครงสร้างของ cron ทำหน้าที่เป็นกระดูกสันหลังในขอบเขตการใช้งานที่กว้างขวาง ตั้งแต่การทริกเกอร์คิว (queues) ในสถาปัตยกรรมไมโครเซอร์วิส (microservices) หรือโมโนลิทิก (monolithic) ไปจนถึงการจัดเก็บไฟล์ข้อมูลเก่า (file archiving) การออกแบบกลไก cron อย่างถูกต้องเป็นเงื่อนไขพื้นฐานในการป้องกันปัญหาฐานข้อมูลล็อก (database locks) ปัญหาหน่วยความจำรั่วไหล (memory leaks) บนเซิร์ฟเวอร์ และปัญหาการหยุดชะงักของระบบอันเนื่องมาจากการกำหนดสิทธิ์ (authorization)

บริการเบื้องหลัง Cron (Daemon) ในระบบ Unix และ Linux

หัวใจสำคัญของสถาปัตยกรรม cron คือบริการเบื้องหลังของระบบ (daemon) ที่ทำงานอย่างต่อเนื่องในเบื้องหลัง นับตั้งแต่วินาทีที่ระบบปฏิบัติการบูต (boot) ขึ้นมา โดยมีชื่อว่าcron(หรือในบางดิสทริบิวชันคือcrond) บริการเบื้องหลัง (daemon) นี้จะยังคงทำงานอยู่ในหน่วยความจำตราบเท่าที่ระบบกำลังทำงานอยู่ และจะตรวจสอบเวลาของระบบทุก ๆ ต้นนาที

crondจะดำเนินงานด้วยวงรอบการหลับ (sleep) และการตื่น (wake):

  • daemon ซึ่งถูกทริกเกอร์ทุก ๆ 60 วินาที จะสแกนตารางงานที่กำหนดไว้ทีละบรรทัด

  • ทำการวิเคราะห์ว่ามีกฎที่ตรงกับนาที ชั่วโมง วันของเดือน เดือน และวันของสัปดาห์ในปัจจุบันหรือไม่

  • เมื่อพบการจับเวลาที่ตรงกัน มันจะเริ่มต้นคำสั่งที่เกี่ยวข้องให้เป็นกระบวนการลูก (child process / subshell) ใหม่ ภายใต้สิทธิ์ของผู้ใช้ที่กำหนดค่าไว้

  • โดยจะจับค่าเอาต์พุตมาตรฐาน (stdout) หรือข้อผิดพลาดมาตรฐาน (stderr) ที่เกิดขึ้นจากคำสั่ง แล้วส่งต่อไปยังบันทึกของระบบ (system logs) หรือกล่องจดหมายที่เกี่ยวข้อง

daemon ที่ทำงานในระดับระบบนี้จะได้รับการควบคุมบนระบบ Ubuntu/Debian ด้วยคำสั่งcronส่วนบนระบบ RHEL/CentOS/AlmaLinux จะใช้คำสั่งcrondในการตรวจสอบ เนื่องจากการหยุดทำงานหรือการขัดข้องของบริการหมายถึงจะไม่มีงานตั้งเวลาใด ๆ ทำงานเลย จึงต้องได้รับการตรวจสอบอย่างต่อเนื่องโดยเอเจนต์ตรวจติดตาม (monitoring agents) ในสภาพแวดล้อมที่ต้องการความพร้อมใช้งานสูง (high availability)

ไฟล์ Crontab (Cron Table) และฟังก์ชันการทำงาน

Crontab (Cron Table) คือไฟล์ข้อความกำหนดค่าที่อ่านโดยcronddaemon โดยไฟล์นี้จะประกอบด้วยบรรทัดต่าง ๆ ที่ระบุว่าคำสั่งใดจะถูกรันเมื่อใด และด้วยตัวแปรสภาพแวดล้อม (environment variables) ใด ในระบบปฏิบัติการจะมีเลเยอร์ของ crontab ที่แตกต่างกันสองระดับ ได้แก่:

  1. ไฟล์ Crontab ในระดับผู้ใช้:ผู้ใช้ระบบทุกคนสามารถมีไฟล์ crontab เฉพาะของตนเองได้ โดยไฟล์เหล่านี้จะถูกเก็บไว้ในไดเรกทอรี/var/spool/cron/crontabs(หรือขึ้นอยู่กับดิสทริบิวชันใน/var/spool/cron) โดยตรง ผู้ใช้จะไม่แก้ไขไฟล์เหล่านี้ด้วยโปรแกรมแก้ไขข้อความโดยตรง แต่จะแก้ไขผ่านคำสั่งcrontab -eเพื่อทำการแก้ไข

  2. ไฟล์ Crontab ในระดับระบบ:จะเก็บไว้โดยตรงในไฟล์/etc/crontabและในไดเรกทอรีระบบอย่าง/etc/cron.d, /etc/cron.daily, /etc/cron.hourlyในไฟล์ระดับระบบนี้ จะมีคอลัมน์ผู้ใช้เพิ่มเติมที่ระบุว่าต้องการให้รันคำสั่งในนามของผู้ใช้ใด (เช่นroot, www-data, nginxเป็นต้น)

# Sistem düzeyindeki /etc/crontab yapısı:
# m h dom mon dow user  command
0 3 * * * root /usr/local/bin/backup-database.sh

ทุกกฎที่เขียนลงในไฟล์ crontab จะต้องอยู่ในบรรทัดเดียว เครื่องหมาย#ที่ใช้ในตอนเริ่มต้นบรรทัด จะระบุว่าบรรทัดนั้นเป็นข้อความหมายเหตุ (comment) และจะถูกละเว้นโดย daemon

กรณีการใช้งาน Cron Job ในระบบองค์กร

ในระบบนิเวศซอฟต์แวร์ขององค์กร วงจรการส่งคำขอและตอบกลับ HTTP (request-response cycle) ซึ่งส่งผลกระทบโดยตรงต่อประสบการณ์ของผู้ใช้ จะถูกแยกออกจากงานคำนวณหนักๆ ที่ต้องทำเบื้องหลังอย่างเด็ดขาด การสร้างไฟล์ขนาดใหญ่หรือการส่งคำขอหลายพันรายการไปยังบริการภายนอกในระหว่างที่ผู้ใช้ส่งคำขอมายังเว็บแอปพลิเคชัน จะทำให้เกิดข้อผิดพลาดในการหมดเวลา (timeout) ทางฝั่งไคลเอนต์ ด้วยเหตุนี้ งานที่ต้องทำเป็นระยะๆ และงานที่ต้องใช้ทรัพยากรสูงจึงถูกส่งต่อไปยังงานที่กำหนดเวลาไว้

กระบวนการสำรองข้อมูลฐานข้อมูลและไฟล์โดยอัตโนมัติ

เสาหลักที่สำคัญที่สุดของแผนการดำเนินธุรกิจอย่างต่อเนื่องและการกู้คืนระบบจากภัยพิบัติ (disaster recovery) คือการสำรองข้อมูลอย่างสม่ำเสมอ กระบวนการสำรองข้อมูลด้วยตนเองมีความเสี่ยงที่ยอมรับไม่ได้เนื่องจากความล่าช้าและการหลงลืมจากปัจจัยมนุษย์ ด้วยการใช้งาน cron job:

  • สำหรับ PostgreSQLpg_dump, ส่วนสำหรับ MySQL/MariaDBmysqldumpคำสั่งเหล่านี้จะถูกเปิดใช้งานโดยอัตโนมัติในช่วงเวลาที่มีการใช้งานทราฟฟิกต่ำที่สุดในตอนกลางคืน (เช่น 03:00 น.)

  • ไฟล์ SQL dump ที่สร้างขึ้นจะถูกบีบอัดโดยใช้gzipหรือbzip2ตัวใดตัวหนึ่ง

  • ไฟล์เก็บถาวรที่สร้างขึ้นจะถูกโอนย้ายไปยัง AWS S3, Google Cloud Storage หรือเซิร์ฟเวอร์ SFTP ภายนอก

  • การตรวจหาและล้างข้อมูลสำรองที่มีอายุเกิน 30 วันออกจากดิสก์ (นโยบายการเก็บรักษาข้อมูล หรือ retention policy) จะถูกจัดการผ่านสคริปต์ cron เช่นกัน

การส่งอีเมลกลุ่มและการตลาดอัตโนมัติ

ในแพลตฟอร์มอีคอมเมิร์ซและ SaaS การดำเนินการกลุ่ม เช่น การแจ้งเตือนใบแจ้งหนี้, การส่งจดหมายข่าว, การแจ้งเตือนการละทิ้งตะกร้าสินค้า และรายงานสรุปประจำสัปดาห์ จะไม่ถูกเปิดใช้งานในทันที การส่งอีเมลหลายแสนฉบับพร้อมกันผ่าน SMTP หรือ API ภายนอก (เช่น SendGrid, Amazon SES, Postmark) จะทำให้ติดขีดจำกัดอัตราการส่งของ API (API rate limits) และทำให้ทรัพยากรของเซิร์ฟเวอร์หมดลง

ทุกๆ 5 หรือ 10 นาที ระบบ Cron job จะเข้าถึงตารางคิวอีเมลในฐานข้อมูล (email_queue) เพื่อทำการตรวจสอบ ดึงข้อมูลรายการที่ยังไม่ส่งจำนวน 500 รายการ ดำเนินการส่ง และอัปเดตสถานะ ซึ่งกระบวนการนี้ไม่เพียงแต่ช่วยกระจายภาระของเซิร์ฟเวอร์ แต่ยังช่วยให้สามารถทำงานต่อในคิวเดิมได้เมื่อเครือข่ายกลับมาใช้งานได้ตามปกติ

การบำรุงรักษาระบบ, การเคลียร์แคช และการจัดการล็อก

การที่พื้นที่ดิสก์หมดบนเซิร์ฟเวอร์โปรดักชันที่ทำงานอย่างต่อเนื่อง เป็นหนึ่งในสาเหตุหลักที่พบบ่อยที่สุดของระบบล่ม กระบวนการบำรุงรักษาที่ปรับแต่งให้เหมาะสมด้วย cron job ครอบคลุมถึง:

  • /var/logไฟล์ล็อกขนาดใหญ่ภายใต้logrotateจะถูกนำมาหมุนเวียน บีบอัด หรือลบออกตามระยะเวลาที่กำหนดผ่านทาง

  • การอุ่นแคช (cache warming) สำหรับแคช Redis หรือ Memcached เป็นระยะๆ หรือการล้างคีย์ที่หมดอายุ,

  • การกำจัดตารางเซสชัน (session tables) และข้อมูลตะกร้าสินค้าที่หมดอายุในแพลตฟอร์มอีคอมเมิร์ซ,

  • ครอบคลุมการทำงานที่สำคัญ เช่น การตรวจสอบวันหมดอายุของใบรับรอง SSL/TLS (เช่น Let's Encrypt / Certbot) และการดำเนินการต่ออายุโดยอัตโนมัติเมื่อจำเป็น

ประเภทการดำเนินงานเวลาทำงานที่เหมาะสมคำสั่ง / เครื่องมือที่แนะนำวัตถุประสงค์หลัก
การสำรองข้อมูลฐานข้อมูลทุกคืน เวลา 02:30 น.pg_dump / mysqldumpการป้องกันการสูญเสียข้อมูลและการจัดเก็บถาวร
การหมุนเวียนล็อกรายวัน / รายสัปดาห์/usr/sbin/logrotateการป้องกันปัญหาดิสก์เต็ม
การประมวลผลคิวทุก ๆ 1-5 นาทีphp artisan queue:workการรันเวิร์กโฟลว์แบบอะซิงโครนัส
การตรวจสอบใบรับรอง SSLวันละ 2 ครั้งcertbot renew --quietการเปิดใช้งานการเข้าถึง HTTPS อย่างต่อเนื่อง
การล้างไฟล์ชั่วคราววันอาทิตย์ เวลา 04:00 น.find /tmp -mtime +7 -deleteการเพิ่มประสิทธิภาพพื้นที่จัดเก็บข้อมูล

การสำรองข้อมูลฐานข้อมูล

เวลาทำงานที่เหมาะสม

ทุกคืน เวลา 02:30 น.

คำสั่ง / เครื่องมือที่แนะนำ

pg_dump / mysqldump

วัตถุประสงค์หลัก

การป้องกันการสูญเสียข้อมูลและการจัดเก็บถาวร

การหมุนเวียนล็อก

เวลาทำงานที่เหมาะสม

รายวัน / รายสัปดาห์

คำสั่ง / เครื่องมือที่แนะนำ

/usr/sbin/logrotate

วัตถุประสงค์หลัก

การป้องกันปัญหาดิสก์เต็ม

การประมวลผลคิว

เวลาทำงานที่เหมาะสม

ทุก ๆ 1-5 นาที

คำสั่ง / เครื่องมือที่แนะนำ

php artisan queue:work

วัตถุประสงค์หลัก

การรันเวิร์กโฟลว์แบบอะซิงโครนัส

การตรวจสอบใบรับรอง SSL

เวลาทำงานที่เหมาะสม

วันละ 2 ครั้ง

คำสั่ง / เครื่องมือที่แนะนำ

certbot renew --quiet

วัตถุประสงค์หลัก

การเปิดใช้งานการเข้าถึง HTTPS อย่างต่อเนื่อง

การล้างไฟล์ชั่วคราว

เวลาทำงานที่เหมาะสม

วันอาทิตย์ เวลา 04:00 น.

คำสั่ง / เครื่องมือที่แนะนำ

find /tmp -mtime +7 -delete

วัตถุประสงค์หลัก

การเพิ่มประสิทธิภาพพื้นที่จัดเก็บข้อมูล

ไวยากรณ์ (Syntax) และหลักการทำงานของ Cron Job

การเขียนนิพจน์ Cron อย่างไม่มีข้อผิดพลาด จำเป็นต้องทำความเข้าใจลำดับขั้นของฟิลด์มาตรฐานทั้ง 5 ฟิลด์ และตรรกะทางคณิตศาสตร์ของอักขระพิเศษที่ใช้ในฟิลด์เหล่านี้ บรรทัดคำสั่ง Crontab มาตรฐานจะประกอบด้วยพารามิเตอร์การตั้งเวลา 5 ตัวที่คั่นด้วยเว้นวรรค ตามด้วยคำสั่งเชลล์ที่จะรัน

* * * * * /calistirilacak/komutun/mutlak/yolu.sh
│ │ │ │ │
│ │ │ │ └─── Haftanın Günü (0 - 6) (Pazar = 0 veya 7)
│ │ │ └────── Ay (1 - 12)
│ │ └──────── Ayın Günü (1 - 31)
│ └────────── Saat (0 - 23)
└──────────── Dakika (0 - 59)

พารามิเตอร์การตั้งเวลาทั้ง 5 ตัว (นาที, ชั่วโมง, วันที่, เดือน, วันในสัปดาห์)

ฟิลด์ทั้ง 5 นี้แต่ละฟิลด์จะแทนช่วงตัวเลขที่กำหนด:

  1. นาที (Minute - 0 - 59):กำหนดว่างานจะเริ่มทำงานที่นาทีใดของชั่วโมง15หากกำหนดค่านี้ จะทำให้งานถูกเรียกทำงานในนาทีที่ 15 ของทุกชั่วโมง

  2. ชั่วโมง (Hour - 0 - 23):ระบุชั่วโมงที่จะให้ทำงานในรูปแบบ 24 ชั่วโมง0แทนเวลาเที่ยงคืน (00:00),14จะแทนเวลา 14:00 น. ในตอนบ่าย

  3. วันที่ของเดือน (Day of Month - 1 - 31):กำหนดวันตามปฏิทินของเดือนนั้น ๆ ที่ต้องการให้งานทำงาน

  4. เดือน (Month - 1 - 12 หรือตัวย่อชื่อเดือน):กำหนดเดือนของปีที่ต้องการให้ทำงาน โดยสามารถใช้ค่าตั้งแต่ 1 (มกราคม) ถึง 12 (ธันวาคม) หรือJAN-DECรูปแบบ ก็สามารถใช้ได้เช่นกัน

  5. วันในสัปดาห์ (Day of Week - 0 - 6 หรือตัวย่อชื่อวัน):กำหนดวันในสัปดาห์ที่ต้องการให้ทำงาน0คือวันอาทิตย์ (ในบางระบบ7ก็ถือว่าเป็นวันอาทิตย์เช่นกัน) โดยที่ 1 คือวันจันทร์ และ 6 คือวันเสาร์SUN-SATตัวย่อเหล่านี้ก็สามารถใช้งานได้เช่นกัน

ความหมายของอักขระพิเศษ (เครื่องหมายดอกจัน, จุลภาค, ยัติภังค์ และเครื่องหมายทับ)

สิ่งที่ทำให้ไวยากรณ์ของ Cron มีความยืดหยุ่นคือตัวดำเนินการพิเศษที่ใช้ภายในแต่ละฟิลด์:

  • ดอกจัน (*- Wildcard):หมายถึง "ทุก ๆ" หรือ "ทุกค่าที่เป็นไปได้" ในฟิลด์นาที*, จะหมายถึง "ทุกนาที"

  • จุลภาค (,- รายการค่า):ใช้เพื่อระบุรายการค่าที่ไม่ต่อเนื่องกันหลายค่า ตัวอย่างเช่น ในฟิลด์ชั่วโมง การระบุ1,5,11หมายความว่าคำสั่งจะทำงานในเวลา 01:00, 05:00 และ 11:00 น.

  • ยัติภังค์ (-- การกำหนดช่วง):ระบุช่วงของค่าที่ต่อเนื่องกัน ตัวอย่างเช่น ในฟิลด์วันในรอบสัปดาห์ การระบุ1-5จะครอบคลุมวันทำการตั้งแต่วันจันทร์ถึงวันศุกร์

  • ทับ (/- ตัวระบุขั้น/ช่วง):ระบุระยะการข้ามในช่วงที่กำหนด ตัวอย่างเช่น ในฟิลด์นาที การระบุ*/15หมายถึง "ทุกๆ 15 นาที" (นาทีที่ 0, 15, 30, 45) ในฟิลด์ชั่วโมง การระบุ0-23/2จะทำหน้าที่ทริกเกอร์ทุกๆ สองชั่วโมง

ตัวอย่างการตั้งเวลาพื้นฐานและขั้นสูง

การกำหนดรูปแบบการตั้งเวลาที่ถูกต้องเป็นกุญแจสำคัญในการป้องกันการใช้ทรัพยากรอย่างไร้ประโยชน์ ด้านล่างนี้คือตัวอย่างการตั้งเวลามาตรฐานและขั้นสูงที่นิยมใช้งานมากที่สุดในระบบโครงสร้างพื้นฐานระดับองค์กร

รูปแบบการตั้งเวลา Cron ที่ใช้บ่อย

  • ทำงานทุกๆ 5 นาที:

*/5 * * * * /usr/bin/php /var/www/html/artisan schedule:run

  • ทำงานทุกวันเวลาเที่ยงคืน (00:00):

0 0 * * * /usr/local/bin/daily-cleanup.sh

  • ทำงานทุกวันทำการเวลา 08:30 น.:

30 8 * * 1-5 /usr/bin/python3 /opt/scripts/morning_report.py

  • รันสคริปต์การเรียกเก็บเงินทุกวันที่ 1 ของเดือน เวลา 04:00 น.:

0 4 1 * * /usr/bin/node /opt/billing/invoice_generator.js

  • สแกนดิสก์อย่างละเอียดในช่วงวันหยุดสุดสัปดาห์ (เสาร์และอาทิตย์) เวลา 02:00 น.:

0 2 * * 6,0 /usr/bin/clamscan -r /home

นอกจากนี้ แอปพลิเคชัน cron ยุคใหม่บางตัวยังรองรับชื่อเรียกย่อพิเศษ (shortcuts) อีกด้วย:

  • @reboot: ทำงานหนึ่งครั้งทุกครั้งที่เซิร์ฟเวอร์เริ่มต้นระบบใหม่

  • @yearlyหรือ@annually : 0 0 1 1 *เทียบเท่ากับ

  • @monthly : 0 0 1 * *เทียบเท่ากับ

  • @weekly : 0 0 * * 0เทียบเท่ากับ

  • @dailyหรือ@midnight : 0 0 * * *เทียบเท่ากับ

  • @hourly : 0 * * * *เทียบเท่ากับ

สถานการณ์ขั้นสูงและการเชื่อมต่อคำสั่ง

ในสภาพแวดล้อมการใช้งานจริง (production) ที่ซับซ้อน แทนที่จะรันคำสั่งเดี่ยวๆ ควรดำเนินตามขั้นตอนที่ต่อเนื่องกันตามสถานะความสำเร็จของกันและกัน

  1. ตัวดำเนินการ AND ทางตรรกศาสตร์ (&&):): คำั่งที่สองจะทำงานก็ต่อเมื่อคำสั่งแรกทำงานสำเร็จเท่านั้น (หากรหัสทางออก0คืนค่ากลับมา)

0 1 * * * /usr/bin/pg_dump dbname > /tmp/db.sql && /usr/bin/aws s3 cp /tmp/db.sql s3://my-backups/

  1. ตัวดำเนินการทำงานตามลำดับ (;):): คำสั่งถัดไปจะทำงานโดยไม่คำนึงว่าคำสั่งแรกจะสำเร็จหรือไม่

0 3 * * * /opt/scripts/task1.sh ; /opt/scripts/task2.sh

  1. การเปลี่ยนเส้นทางเอาต์พุตและการระงับเอาต์พุต (I/O Redirection):โดยค่าเริ่มต้น คำสั่ง cron จะพยายามส่งเอาต์พุตที่สร้างขึ้นทั้งหมดไปยังผู้ใช้ระบบทางอีเมลท้องถิ่น (mail) เพื่อหลีกเลี่ยงไม่ให้กล่องข้อความเต็มหรือเพื่อแยกวิเคราะห์บันทึก จะมีการเปลี่ยนเส้นทางเอาต์พุตมาตรฐาน (stdout- ตัวบ่งชี้ไฟล์ 1) และข้อผิดพลาดมาตรฐาน (stderr- ตัวบ่งชี้ไฟล์ 2) ไปยัง:

  • ละเว้นเอาต์พุตทั้งหมด (โหมดปิดเสียง):

*/10 * * * * /usr/local/bin/sync.sh > /dev/null 2>&1

  • เขียนเอาต์พุตมาตรฐานและข้อผิดพลาดแยกต่างหากลงในไฟล์บันทึก:

0 2 * * * /usr/local/bin/maintenance.sh >> /var/log/maintenance.log 2>> /var/log/maintenance_error.log

วิธีการติดตั้งและกำหนดค่า Cron Job

การกำหนดงานตั้งเวลา (scheduled tasks) ในระบบสามารถทำได้สองวิธีหลักๆ ขึ้นอยู่กับโครงสร้างพื้นฐานของเซิร์ฟเวอร์และสิทธิ์ในการเข้าถึง: แผงควบคุมบนเว็บ (cPanel, Plesk, DirectAdmin) หรือบรรทัดคำสั่งเทอร์มินัลผ่าน SSH โดยตรง

การกำหนดค่าแบบกราฟิกผ่าน cPanel และแผงควบคุม

บนแชร์โฮสติ้งหรือเซิร์ฟเวอร์ที่มีแผงควบคุมการจัดการ สามารถกำหนดค่างาน cron ได้โดยไม่จำเป็นต้องมีความรู้เรื่องบรรทัดคำสั่ง:

  1. การเข้าสู่ระบบแผงควบคุมและเมนู Cron:เข้าสู่ระบบบัญชี cPanel และภายใต้แท็บ "ขั้นสูง" (Advanced) ให้คลิกที่งานตั้งเวลา (Cron Jobs)ไอคอน

  2. การตั้งค่าการแจ้งเตือนทางอีเมล:กำหนดที่อยู่อีเมลที่จะส่งการแจ้งเตือนเมื่อเกิดข้อผิดพลาดหรือมีผลลัพธ์ หรือปิดใช้งานส่วนนี้

  3. การเลือกช่วงเวลา:สามารถเลือกเทมเพลตสำเร็จรูป (เช่น "วันละครั้ง", "ชั่วโมงละครั้ง") จากเมนูแบบดรอปดาวน์ "การตั้งค่าทั่วไป" (Common Settings) หรือจะป้อนค่าที่กำหนดเองในช่องนาที, ชั่วโมง, วัน ก็ได้

  4. การป้อนคำสั่ง:คำสั่งที่จะรันจะถูกเขียนโดยใช้เส้นทางแบบสัมบูรณ์ (absolute path) ตัวอย่างเช่น หากต้องการเรียกใช้สคริปต์ PHP ผ่านเว็บ:

/usr/bin/curl -s -o /dev/null https://example.com/cron-runner.php
หรือหากต้องการรันโดยตรงจากแกนหลักของเซิร์ฟเวอร์ด้วย PHP CLI:
/usr/local/bin/php /home/username/public_html/cron.php

การจัดการ Crontab ด้วยตนเองผ่านเทอร์มินัลและ SSH

บนเซิร์ฟเวอร์ VPS, VDS หรือ Dedicated ผู้ดูแลระบบจะจัดการ crontab ผ่านเทอร์มินัลโดยเชื่อมต่อ SSH โดยตรง

คำสั่ง Crontab พื้นฐาน:

  • crontab -e: เปิดไฟล์ crontab ของผู้ใช้ปัจจุบันในโปรแกรมแก้ไขข้อความเริ่มต้น (nano หรือ vim) และอนุญาตให้แก้ไขได้ ในการรันครั้งแรกอาจมีการขอให้เลือกโปรแกรมแก้ไข

  • crontab -l: แสดงรายการกฎที่มีอยู่ทั้งหมดในไฟล์ crontab ของผู้ใช้ปัจจุบัน โดยพิมพ์เนื้อหาออกมาทางหน้าจอ

  • crontab -r: ลบไฟล์ crontab ของผู้ใช้ปัจจุบันทั้งหมด (ควรใช้อย่างระมัดระวังอย่างยิ่งเนื่องจากไม่สามารถย้อนกลับได้)

  • crontab -u username -e: ช่วยให้ผู้ดูแลระบบที่มีสิทธิ์ root สามารถแก้ไขไฟล์ crontab ของผู้ใช้เฉพาะเจาะจงได้

:::
title: รายการตรวจสอบการกำหนดงาน Cron
description: การตรวจสอบที่สำคัญซึ่งต้องทำให้เสร็จสิ้นก่อนที่จะนำงานตั้งเวลาไปใช้งานจริง
items:

  • title: การตรวจสอบเส้นทางแบบสัมบูรณ์ (Absolute Path)

description: เส้นทางไบนารีและไฟล์ทั้งหมดภายในสคริปต์รวมถึงในบรรทัด crontab (เช่น/usr/bin/php) จะต้องระบุอย่างครบถ้วนสมบูรณ์

  • title: สิทธิ์การใช้งานไฟล์และสิทธิ์ CHMOD

description: ควรตรวจสอบให้แน่ใจว่าสคริปต์ที่จะรันนั้นมีสิทธิ์ในการอ่านและรันโปรแกรม (chmod +x script.sh) อยู่

  • title: การเปลี่ยนเส้นทางบันทึกข้อผิดพลาดและผลลัพธ์

description: ควรตรวจสอบให้แน่ใจว่าสตรีมเอาต์พุตมาตรฐานและข้อผิดพลาดของงานนั้น ถูกเปลี่ยนเส้นทางไปยังไฟล์บันทึกที่เหมาะสม

  • title: ขอบเขตสิทธิ์ของผู้ใช้งาน

description: ควรเลือกบัญชีผู้ใช้ที่มีสิทธิ์ต่ำสุดเท่าที่จำเป็นสำหรับงานนั้นๆ และไม่ควรให้สิทธิ์ root โดยไม่จำเป็น
:::

คำเตือนเกี่ยวกับความปลอดภัยและประสิทธิภาพที่สำคัญในงานตั้งเวลา

เมื่อไม่ได้จัดการงานที่กำหนดเวลาไว้อย่างถูกต้อง อาจนำไปสู่ปัญหาเซิร์ฟเวอร์ค้าง ความไม่สอดคล้องของฐานข้อมูล และช่องโหว่ด้านความปลอดภัยได้ การที่สคริปต์ซึ่งทำงานอยู่เบื้องหลังอย่างเงียบๆ เกิดลูปไม่รู้จบ (infinite loop) หรือทำงานนานกว่าที่กำหนดไว้ อาจส่งผลให้ทรัพยากรทั้งหมด of เซิร์ฟเวอร์ถูกใช้ไปจนหมด

การควบคุมภาระงานของเซิร์ฟเวอร์ (Server Load) และการใช้ทรัพยากr

การเริ่มต้นทำงานของงาน Cron ที่ใช้ทรัพยากรสูงหลายงานพร้อมกันในนาทีเดียวกัน (เช่น เวลา 00:00 น. ในตอนกลางคืน) จะนำไปสู่ภาวะคอขวด (bottleneck) ของ CPU และ I/O ในการวางแผนกำหนดเวลาทำงาน แทนที่จะเลือกใช้เวลาเริ่มต้นของทุกต้นชั่วโมง00:17, 00:43เช่นนี้ซึ่งเป็นนาทีที่มีการกระจายตัวแบบสุ่มควรได้รับการพิจารณาเลือกใช้

เพื่อลดระดับความสำคัญของสคริปต์เบื้องหลังที่ประมวลผลหนักลงในระบบและจำกัดการใช้ทรัพยากร จะมีการใช้เครื่องมือniceและioniceดังนี้:

  • nice -n 19 /path/to/heavy-script.sh: ปรับลดความสำคัญของ CPU สำหรับคำสั่งนั้นให้อยู่ในระดับต่ำสุด โดยจะให้ความสำคัญกับคำขอทางเว็บอื่นๆ ก่อนในขณะที่เซิร์ฟเวอร์กำลังยุ่ง

  • ionice -c 3 /path/to/disk-heavy-script.sh: ปรับระดับความสำคัญในการอ่าน/เขียนดิสก์ของคำสั่งให้อยู่ในโหมดว่าง (idle)

ความเสี่ยงที่เกิดจากงานที่ซ้ำซ้อนและมาตรการป้องกัน

เมื่อตั้งค่าให้งาน Cron ทำงานทุกๆ 5 นาที แต่ตัวสคริปต์กลับใช้เวลาทำงานนานถึง 8 นาทีอันเนื่องมาจากปริมาณข้อมูลที่ไม่คาดคิด จะทำให้เกิดความเสี่ยงต่อการทับซ้อนกันอย่างร้ายแรง เมื่อกระบวนการที่สองถูกเรียกใช้งานในขณะที่กระบวนการแรกยังทำงานไม่เสร็จสิ้น จะเกิดความพยายามในการเข้าแก้ไขข้อมูลในฐานข้อมูลเดียวกันพร้อมกัน ซึ่งสถานการณ์นี้จะส่งผลให้ข้อมูลเสียหายจากสภาวะการแย่งชิงทรัพยากร (race condition) และเกิดปัญหาหน่วยความจำล้น (memory overflow)

เพื่อแก้ไขปัญhานี้ ควรใช้กลไกการล็อก (mutex / lock files) ในสภาพแวดล้อมของ Linuxflockด้วยเครื่องมือนี้ จะสามารถรับประกันได้ว่าจะมีอินสแตนซ์ของงานเพียงหนึ่งเดียวเท่านั้นที่ทำงานในเวลาเดียวกัน:

# Görev kilitliyse yeni instance başlatmadan sessizce çıkış yapar:
*/5 * * * * /usr/bin/flock -n /tmp/task.lock /usr/bin/php /var/www/script.php

ระบบการบันทึกประวัติข้อผิดพลาด (Logging) และการตรวจสอบกระบวนการ

เนื่องจากงาน Cron ทำงานเป็นอิสระจากเซสชันของเทอร์มินัล ข้อผิดพลาดที่เกิดขึ้นจึงไม่แสดงผลบนหน้าจอ เพื่อป้องกันสถานการณ์ที่งานล้มเหลวอย่างเงียบๆ (silent failure) จึงมีการรวมระบบตรวจสอบ (monitoring systems) เข้ากับโครงสร้างพื้นฐานระดับองค์กร:

  • การผสานการทำงานกับ Sentry / Bugsnag:มีการใส่บล็อกดักจับข้อผิดพลาดไว้ในสคริปต์ Cron ที่เขียนขึ้นด้วยภาษาสคริปต์ต่างๆ

  • Dead Man's Snitch / Cronitor / Healthchecks.io:เมื่อสิ้นสุดการทำงานตามช่วงเวลาที่กำหนด จะส่งคำขอ Ping (HTTP GET) หากไม่ได้รับการตอบกลับจาก Ping ภายในเวลาที่คาดหมาย จะมีการแจ้งเตือนไปยังวิศวกรผู้ดูแลระบบหรือส่งสัญญาณเตือนไปยังระบบ

  • ตัวแปรสภาพแวดล้อม (Environment Variables) และข้อผิดพลาด PATH:Cron จะไม่โหลดไฟล์.bashrcหรือ.bash_profileของอินเตอร์แอคทีฟเชลล์ (interactive shell) ของผู้ใช้ แต่ทำงานด้วยสภาพแวดล้อมPATHที่มีข้อจำกัดอย่างยิ่ง ด้วยเหตุนี้ การเขียนเพียงphpหรือpythonภายในสคริปต์อาจส่งผลให้เกิดข้อผิดพลาด "command not found" ได้ ดังนั้นจึงควรระบุพาธแบบเต็มเสมอ เช่น/usr/bin/phpจะต้องใช้พาธแบบเต็มลักษณะนี้

คำถามที่พบบ่อย

Q1: ความแตกต่างพื้นฐานระหว่างงาน Cron (Cron job) กับคำสั่งเทอร์มินัลมาตรฐานคืออะไร?
A1: คำสั่งเทอร์มินัลมาตรฐานจะถูกเรียกใช้งานโดยผู้ใช้ด้วยตนเอง และอาจสิ้นสุดลงเมื่อเซสชันปิดลง ในขณะที่งาน Cron จะทำงานโดยอัตโนมัติในเบื้องหลังโดยดีมอน (daemon) ของระบบปฏิบัติการ โดยเป็นอิสระจากเซสชันของผู้ใช้ และเป็นไปตามกำหนดการที่ระบุไว้ล่วงหน้า

Q2: ความแตกต่างระหว่าง WP-Cron ของ WordPress กับงาน Cron จริงในระดับเซิร์ฟเวอร์คืออะไร?
A2: WP-Cron เป็นกลไกเสมือนที่จะถูกเรียกใช้งานเพื่อโหลดหน้าเว็บเมื่อมีผู้เยี่ยมชมเว็บไซต์เท่านั้น และอาจทำให้งานล่าช้าในไซต์ที่มีทราฟฟิกต่ำ ในขณะที่งาน Cron จริงของเซิร์ฟเวอร์จะดำเนินการตรงเวลาโดยระบบปฏิบัติการโดยตรง โดยไม่ขึ้นกับปริมาณการเข้าชมไซต์แต่อย่างใด

Q3: ทำไมจึงเกิดข้อผิดพลาด PATH ในไฟล์ Crontab และจะแก้ไขได้อย่างไร?
C3: Cron daemon จะไม่โหลดตัวแปรสภาพแวดล้อมที่หลากหลายในเทอร์มินัลของผู้ใช้PATHโดยอัตโนมัติ และจะใช้ชุดไดเรกทอรีที่จำกัด เพื่อแก้ไขปัญหานี้ ควรใช้พาธแบบสัมบูรณ์ (absolute path) ที่สมบูรณ์ของไฟล์ไบนารีโดยตรงในบรรทัดคำสั่ง (เช่นphpแทน/usr/bin/php) หรือควรระบุการกำหนดค่าPATHไว้ที่ส่วนบนสุดของ crontab

S4: ฉันจะป้องกันไม่ให้งาน cron (cron job) ทำงานพร้อมกันหลายครั้งได้อย่างไร?
C4: เพื่อป้องกันไม่ให้งานทับซ้อนกัน จะใช้เครื่องมือที่มีอยู่ในระบบ Linux อย่างflockโดยเมื่อเพิ่มพารามิเตอร์flock -nไว้ที่ด้านหน้าของคำสั่ง จะช่วยป้องกันไม่ให้เริ่มกระบวนการย่อยใหม่ก่อนที่กระบวนการก่อนหน้าจะเสร็จสิ้น และช่วยหลีกเลี่ยงการทับซ้อนกันได้

S5: จะตรวจสอบผ่านระบบได้อย่างไรว่า cron job กำลังทำงานอยู่หรือไม่?
C5: ในระบบ Ubuntu และ Debian จะตรวจสอบโดยการกรองไฟล์/var/log/syslogส่วนในระบบ RHEL และ CentOS จะกรองไฟล์/var/log/cronเพื่อตรวจสอบ และสามารถใช้คำสั่งgrep CRON /var/log/syslogเพื่อตรวจสอบการทริกเกอร์ในอดีตและผลลัพธ์ของคำสั่งได้

S6: เป็นไปได้ไหมที่จะรัน cron job ด้วยความละเอียดระดับวินาที?
C6: Cron daemon มาตรฐานรองรับ 1 นาทีเป็นหน่วยเวลาที่เล็กที่สุด และไม่สามารถกำหนดเวลาแบบวินาทีได้โดยตรง หากต้องการประมวลผลด้วยความละเอียดระดับวินาที จะต้องใช้ตัวจัดการคิว (เช่น Supervisor, Systemd Timer) ที่ทำงานในเบื้องหลังอย่างต่อเนื่อง หรือใช้ลูปเชลล์แบบพิเศษที่เพิ่มการหน่วงเวลาsleepเข้าไปในคำสั่ง

S7: การปิดแสดงผลลัพธ์ของงาน cron ทั้งหมดโดยสิ้นเชิงจะส่งผลเสียต่อเซิร์ฟเวอร์หรือไม่?
C7: การเพิ่ม>/dev/null 2>&1ไว้ที่ส่วนท้ายของคำสั่งเพื่อปิดการแสดงผลลัพธ์ทั้งหมดจะไม่ทำให้เซิร์ฟเวอร์ทำงานหนักขึ้น แต่จะป้องกันไม่ให้บันทึกข้อผิดพลาดที่อาจเกิดขึ้นขณะทำงาน ดังนั้นสำหรับงานที่สำคัญในระบบที่ใช้งานจริง (production) แทนที่จะละทิ้งผลลัพธ์ ขอแนะนำให้บันทึกผลลัพธ์ลงในไฟล์ล็อกเฉพาะ (>> /var/log/gorev.log 2>&1) แทน

S8: จะตั้งค่าเขตเวลา (Timezone) ในไฟล์ crontab ได้อย่างไร?
C8: ตามค่าเริ่มต้น Cron จะอ้างอิงตามเขตเวลาหลักของระบบเซิร์ฟเวอร์ (โดยปกติคือ UTC) หากต้องการกำหนดเวลาทำงานตามเขตเวลาอื่น คุณสามารถเพิ่มพารามิเตอร์CRON_TZ=Europe/Istanbulไว้ที่บรรทัดบนสุดของไฟล์ crontab เพื่อกำหนดเวลาทำงานตามภูมิภาคนั้น ๆ ได้

คำถามที่พบบ่อย

ความแตกต่างพื้นฐานระหว่างงาน Cron (Cron job) กับคำสั่งเทอร์มินัลมาตรฐานคืออะไร?

คำสั่งเทอร์มินัลมาตรฐานจะถูกเรียกใช้งานโดยผู้ใช้ด้วยตนเอง และอาจสิ้นสุดลงเมื่อเซสชันปิดลง ในขณะที่งาน Cron จะทำงานโดยอัตโนมัติในเบื้องหลังโดยดีมอน (daemon) ของระบบปฏิบัติการ โดยเป็นอิสระจากเซสชันของผู้ใช้ และเป็นไปตามกำหนดการที่ระบุไว้ล่วงหน้า

ความแตกต่างระหว่าง WP-Cron ของ WordPress กับงาน Cron จริงในระดับเซิร์ฟเวอร์คืออะไร?

WP-Cron เป็นกลไกเสมือนที่จะถูกเรียกใช้งานเพื่อโหลดหน้าเว็บเมื่อมีผู้เยี่ยมชมเว็บไซต์เท่านั้น และอาจทำให้งานล่าช้าในไซต์ที่มีทราฟฟิกต่ำ ในขณะที่งาน Cron จริงของเซิร์ฟเวอร์จะดำเนินการตรงเวลาโดยระบบปฏิบัติการโดยตรง โดยไม่ขึ้นกับปริมาณการเข้าชมไซต์แต่อย่างใด

ทำไมจึงเกิดข้อผิดพลาด PATH ในไฟล์ Crontab และจะแก้ไขได้อย่างไร?

Cron daemon จะไม่โหลดตัวแปรสภาพแวดล้อมที่หลากหลายในเทอร์มินัลของผู้ใช้ PATH โดยอัตโนมัติ และจะใช้ชุดไดเรกทอรีที่จำกัด เพื่อแก้ไขปัญหานี้ ควรใช้พาธแบบสัมบูรณ์ (absolute path) ที่สมบูรณ์ของไฟล์ไบนารีโดยตรงในบรรทัดคำสั่ง (เช่น php แทน /usr/bin/php ) หรือควรระบุการกำหนดค่า PATH ไว้ที่ส่วนบนสุดของ crontab

ฉันจะป้องกันไม่ให้งาน cron (cron job) ทำงานพร้อมกันหลายครั้งได้อย่างไร?

เพื่อป้องกันไม่ให้งานทับซ้อนกัน จะใช้เครื่องมือที่มีอยู่ในระบบ Linux อย่าง flock โดยเมื่อเพิ่มพารามิเตอร์ flock -n ไว้ที่ด้านหน้าของคำสั่ง จะช่วยป้องกันไม่ให้เริ่มกระบวนการย่อยใหม่ก่อนที่กระบวนการก่อนหน้าจะเสร็จสิ้น และช่วยหลีกเลี่ยงการทับซ้อนกันได้

จะตรวจสอบผ่านระบบได้อย่างไรว่า cron job กำลังทำงานอยู่หรือไม่?

ในระบบ Ubuntu และ Debian จะตรวจสอบโดยการกรองไฟล์ /var/log/syslog ส่วนในระบบ RHEL และ CentOS จะกรองไฟล์ /var/log/cron เพื่อตรวจสอบ และสามารถใช้คำสั่ง grep CRON /var/log/syslog เพื่อตรวจสอบการทริกเกอร์ในอดีตและผลลัพธ์ของคำสั่งได้

เป็นไปได้ไหมที่จะรัน cron job ด้วยความละเอียดระดับวินาที?

Cron daemon มาตรฐานรองรับ 1 นาทีเป็นหน่วยเวลาที่เล็กที่สุด และไม่สามารถกำหนดเวลาแบบวินาทีได้โดยตรง หากต้องการประมวลผลด้วยความละเอียดระดับวินาที จะต้องใช้ตัวจัดการคิว (เช่น Supervisor, Systemd Timer) ที่ทำงานในเบื้องหลังอย่างต่อเนื่อง หรือใช้ลูปเชลล์แบบพิเศษที่เพิ่มการหน่วงเวลา sleep เข้าไปในคำสั่ง

การปิดแสดงผลลัพธ์ของงาน cron ทั้งหมดโดยสิ้นเชิงจะส่งผลเสียต่อเซิร์ฟเวอร์หรือไม่?

การเพิ่ม >/dev/null 2>&1 ไว้ที่ส่วนท้ายของคำสั่งเพื่อปิดการแสดงผลลัพธ์ทั้งหมดจะไม่ทำให้เซิร์ฟเวอร์ทำงานหนักขึ้น แต่จะป้องกันไม่ให้บันทึกข้อผิดพลาดที่อาจเกิดขึ้นขณะทำงาน ดังนั้นสำหรับงานที่สำคัญในระบบที่ใช้งานจริง (production) แทนที่จะละทิ้งผลลัพธ์ ขอแนะนำให้บันทึกผลลัพธ์ลงในไฟล์ล็อกเฉพาะ ( >> /var/log/gorev.log 2>&1 ) แทน

จะตั้งค่าเขตเวลา (Timezone) ในไฟล์ crontab ได้อย่างไร?

ตามค่าเริ่มต้น Cron จะอ้างอิงตามเขตเวลาหลักของระบบเซิร์ฟเวอร์ (โดยปกติคือ UTC) หากต้องการกำหนดเวลาทำงานตามเขตเวลาอื่น คุณสามารถเพิ่มพารามิเตอร์ CRON_TZ=Europe/Istanbul ไว้ที่บรรทัดบนสุดของไฟล์ crontab เพื่อกำหนดเวลาทำงานตามภูมิภาคนั้น ๆ ได้

ขั้นตอนสุดท้าย

มาวางแผนโปรเจกต์ดิจิทัลของคุณวันนี้

เปลี่ยนความต้องการด้านเว็บไซต์ ซอฟต์แวร์ E-Commerce แอปมือถือ การเชื่อมต่อ SEO หรือ GEO ให้เป็นขอบเขตงานที่ชัดเจน

Cron Job คืออะไร และงานตั้งเวลาทำงานอย่างไร? | Webizm