คำตอบสั้น ๆ: สร้างงานตามเวลาผ่านหน้าจอ 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 ซึ่งเป็นสิ่งที่ทำให้งานถูกนับว่าล้มเหลว