ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

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

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

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

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

สิ่งที่ต้องเตรียม

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

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

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

ไปที่ 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

ปัญหาที่พบบ่อย

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

ตรวจว่าบริการ 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/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security