ตั้ง Scheduled Task และ Cron บน Plesk

สร้างงานตามเวลาผ่านหน้าจอ Plesk ทั้งการรันคำสั่ง สคริปต์ PHP และการเรียก URL พร้อมวิธีดูผลและแก้เมื่องานไม่ทำงาน

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 8 นาที เข้าชม 5 ครั้ง

แชร์FacebookXLINELinkedIn
Scheduled Task — ตั้ง Scheduled Task และ Cron บน Plesk
ตั้ง Scheduled Task และ Cron บน Plesk

คำตอบสั้น ๆ: สร้างงานตามเวลาผ่านหน้าจอ Plesk ทั้งการรันคำสั่ง สคริปต์ PHP และการเรียก URL พร้อมวิธีดูผลและแก้เมื่องานไม่ทำงาน

คู่มือนี้อธิบาย Scheduled Task ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

งานที่ต้องทำซ้ำตามเวลาเป็นส่วนสำคัญของเว็บที่ทำงานจริง ตั้งแต่การสำรองข้อมูล การล้างไฟล์ชั่วคราว ไปจนถึงการรัน WP-Cron ของ WordPress ให้ตรงเวลาแทนการรอให้มีคนเข้าเว็บ

Plesk มีหน้าจอจัดการงานเหล่านี้ที่ใช้งานง่ายกว่าการแก้ crontab โดยตรง และรองรับการส่งผลลัพธ์ทางอีเมลซึ่งช่วยให้รู้ทันทีเมื่องานล้มเหลว

สิ่งที่ต้องเตรียม (Scheduled Task)

  • Plesk Obsidian และสิทธิ์เข้าถึงโดเมนที่ต้องการ
  • คำสั่งหรือสคริปต์ที่ทดสอบด้วยมือจนผ่านแล้ว

ทดสอบด้วยมือก่อนเสมอ ปัญหาส่วนใหญ่ของงานตามเวลาไม่ได้อยู่ที่ตัวตั้งเวลา แต่อยู่ที่สคริปต์ที่พึ่งพาสภาพแวดล้อมซึ่งมีเฉพาะตอนล็อกอิน

ขั้นตอนที่ 1: สร้างงานใหม่ (Scheduled Task)

ไปที่ Domains เลือกโดเมน แล้ว Scheduled Tasks แล้วกด Add Task

เลือกชนิดของงาน

  • Run a command รันคำสั่งของระบบ ยืดหยุ่นที่สุด
  • Fetch a URL เรียก URL ผ่าน HTTP เหมาะกับงานที่เขียนเป็นหน้าเว็บ
  • Run a PHP script รันไฟล์ PHP โดยตรงด้วย PHP ของโดเมนนั้น

ขั้นตอนที่ 2: ตัวอย่างงานที่ใช้บ่อย

รัน WP-Cron ของ WordPress

ปิด WP-Cron ในไฟล์ wp-config.php ก่อน

define('DISABLE_WP_CRON', true);

แล้วสร้างงานชนิด Run a PHP script

Script path: httpdocs/wp-cron.php
Arguments:   (เว้นว่าง)
Run:         Cron style  */5 * * * *

วิธีนี้ดีกว่าการใช้ Fetch a URL เพราะไม่กิน worker ของเว็บและไม่ติดปัญหาเมื่อเว็บมีการป้องกันด้วยรหัสผ่าน

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

Command: find /var/www/vhosts/example.com/httpdocs/wp-content/uploads/tmp -type f -mtime +7 -delete
Run:     Daily at 03:00

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

Command: /usr/local/bin/backup-db.sh
Run:     Daily at 02:00

ขั้นตอนที่ 3: ตั้งรอบเวลา

Plesk ให้เลือกได้สองแบบ แบบง่ายที่เลือกจากรายการ และแบบ Cron style ที่ยืดหยุ่นกว่า

# รูปแบบ: นาที ชั่วโมง วันที่ เดือน วันในสัปดาห์
*/5 * * * *      ทุก 5 นาที
0 * * * *        ทุกต้นชั่วโมง
0 3 * * *        ทุกวันตีสาม
30 2 * * 1       ทุกวันจันทร์ 02:30
0 4 1 * *        ทุกวันที่ 1 ของเดือน ตีสี่
0 */6 * * *      ทุก 6 ชั่วโมง

ตรวจว่าเซิร์ฟเวอร์ใช้ Timezone อะไร เพราะเวลาที่ตั้งอิงตามนั้น

timedatectl
sudo plesk bin server_pref --show | grep -i time

ตั้งเป็นเวลาไทยได้ที่ Tools & Settings แล้ว System Time

ขั้นตอนที่ 4: ตั้งการรับผลลัพธ์

ในหน้าสร้างงาน มีตัวเลือก Notify ซึ่งแนะนำให้ตั้งเป็น Errors only

  • Do not notify ไม่ส่งเลย เสี่ยงที่งานจะล้มเหลวเงียบ ๆ เป็นเดือน
  • Errors only ส่งเฉพาะเมื่อมีข้อความออกทาง stderr หรือ exit code ไม่เป็นศูนย์ เหมาะที่สุด
  • Always ส่งทุกครั้ง ทำให้อีเมลท่วมจนคนเลิกอ่าน ซึ่งแย่กว่าไม่ส่งเลย

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

#!/bin/bash
set -euo pipefail

if ! mysqldump --single-transaction mydb | gzip > /backup/db.sql.gz; then
  echo "สำรองฐานข้อมูลล้มเหลว" >&2
  exit 1
fi
# ไม่พิมพ์อะไรเมื่อสำเร็จ

ขั้นตอนที่ 5: ทดสอบทันทีโดยไม่ต้องรอ

ในรายการงาน กดที่ชื่องานแล้วกด Run Now ระบบจะรันทันทีและแสดงผลลัพธ์

อ่านผลลัพธ์ทั้งหมด โดยเฉพาะข้อความที่ออกทาง stderr ซึ่งเป็นสิ่งที่ทำให้งานถูกนับว่าล้มเหลว

ขั้นตอนที่ 6: ดูงานทั้งหมดจากบรรทัดคำสั่ง

# งานของผู้ใช้โดเมน
sudo crontab -l -u example_user

# งานของ root
sudo crontab -l

# ไฟล์ cron ของระบบ
ls -l /etc/cron.d/

Plesk เก็บงานของแต่ละโดเมนไว้ใน crontab ของผู้ใช้ระบบที่ตรงกับโดเมนนั้น

ขั้นตอนที่ 7: ดู Log เมื่องานไม่ทำงาน

# Log ของ cron ระบบ
sudo grep CRON /var/log/syslog | tail -30
sudo journalctl -u cron --since today

# Log ของโดเมน
sudo tail -50 /var/www/vhosts/example.com/logs/error_log

ใน Log ของ cron จะเห็นว่างานถูกเรียกหรือไม่ ซึ่งแยกได้ว่าปัญหาอยู่ที่ตัวตั้งเวลาหรืออยู่ที่สคริปต์

ขั้นตอนที่ 8: ข้อควรระวัง

  • ใช้พาธเต็มเสมอ งานตามเวลาไม่มี PATH เหมือนตอนล็อกอิน ใช้ /usr/bin/php แทน php
  • ระบุโฟลเดอร์ทำงาน ด้วย cd /path && command เพราะงานเริ่มที่โฮมไดเรกทอรีเสมอ
  • อย่าตั้งงานหนักในเวลาเดียวกัน กระจายเวลาออก เช่น ตีสอง ตีสองสิบห้า ตีสองสามสิบ ไม่ใช่ตีสองทั้งหมด
  • ระวังงานที่รันทับกัน หากงานใช้เวลานานกว่ารอบ จะมีหลายตัวรันพร้อมกัน ใช้ไฟล์ล็อกกัน
#!/bin/bash
exec 9>/var/lock/myjob.lock
if ! flock -n 9; then
  echo "งานรอบก่อนยังไม่เสร็จ ข้ามรอบนี้"
  exit 0
fi

# งานจริงอยู่ตรงนี้
/usr/local/bin/heavy-task.sh

ปัญหาที่พบบ่อยเกี่ยวกับ Scheduled Task

งานไม่ทำงานเลย

ตรวจว่าบริการ cron ทำงานอยู่ และตรวจว่างานถูกเปิดใช้งานในหน้า Plesk ไม่ได้ถูกปิดไว้

sudo systemctl status cron
sudo systemctl status crond   # AlmaLinux และ Rocky

รันด้วยมือได้แต่ตามเวลาไม่ได้

เกือบทุกครั้งเป็นเรื่อง PATH และโฟลเดอร์ทำงาน ใช้พาธเต็มและ cd ไปยังโฟลเดอร์ที่ถูกต้องก่อนรัน

ได้อีเมลแจ้งข้อผิดพลาดทุกครั้งทั้งที่งานสำเร็จ

สคริปต์พิมพ์ข้อความออกทาง stderr แม้ทำงานปกติ ให้เปลี่ยนไปพิมพ์ทาง stdout หรือระงับด้วย 2>/dev/null เฉพาะส่วนที่ไม่ใช่ข้อผิดพลาดจริง

งานถูกฆ่ากลางทาง

อาจชนขีดจำกัดเวลาหรือหน่วยความจำของ PHP ตั้งเพิ่มเฉพาะงานนั้น

/usr/bin/php -d memory_limit=512M -d max_execution_time=0 /path/script.php

ต้องการ Cloud VPS พร้อม Plesk ที่มีทีมงานช่วยตั้งงานอัตโนมัติให้ ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

สรุปขั้นตอน Scheduled Task

ทบทวน Scheduled Task ทั้งหมดตามลำดับ ก่อนนำไปใช้กับระบบจริง

  1. สร้างงานใหม่ (Scheduled Task)
  2. ตัวอย่างงานที่ใช้บ่อย
  3. ตั้งรอบเวลา
  4. ตั้งการรับผลลัพธ์
  5. ทดสอบทันทีโดยไม่ต้องรอ
  6. ดูงานทั้งหมดจากบรรทัดคำสั่ง
  7. ดู Log เมื่องานไม่ทำงาน
  8. ข้อควรระวัง

เมื่อทำครบทุกข้อแล้ว Scheduled Task จะพร้อมใช้งาน หากผลลัพธ์ไม่เป็นไปตามที่คาด ให้ย้อนกลับไปดูหัวข้อปัญหาที่พบบ่อยด้านบน ซึ่งรวบรวมกรณีที่พบจริงจากการใช้งาน Scheduled Task ไว้แล้ว

อ่านเพิ่มเติมเกี่ยวกับ Scheduled Task

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน