DevToolPal
ไทย

นิพจน์ Cron

วันสุดท้ายของทุกเดือน

cron มาตรฐานไม่มีสัญลักษณ์ "วันสุดท้าย" งานจึงรันวันที่ 28–31 แล้วใช้การตรวจใน shell ให้ทำต่อเฉพาะเมื่อพรุ่งนี้เป็นวันที่ 1

0 0 28-31 * * เปิดในเครื่องมือแยกวิเคราะห์ Cron

บรรทัด crontab ใช้ GNU date (date -d tomorrow) บน macOS ให้ใช้ date -v+1d ส่วน Quartz และ Spring รองรับ L โดยตรง ใน Kubernetes และ GitHub Actions ให้ใส่การตรวจวันที่แบบเดียวกันไว้ต้นงาน

ทีละฟิลด์

ฟิลด์ ค่า ตรงกับ
นาที 0 0
ชั่วโมง 0 0
วันที่ 28-31 28, 29, 30, 31
เดือน * ทุกค่า
วันในสัปดาห์ * ทุกค่า

เวลารันครั้งถัดไป

ตัวอย่าง: การรัน 6 ครั้งแรกหลัง 1 มกราคม 2569 (UTC)

  1. เสาร์ 31 ม.ค. 2569 00:00
  2. เสาร์ 28 ก.พ. 2569 00:00
  3. อังคาร 31 มี.ค. 2569 00:00
  4. พฤหัส 30 เม.ย. 2569 00:00
  5. อาทิตย์ 31 พ.ค. 2569 00:00
  6. อังคาร 30 มิ.ย. 2569 00:00

เวอร์ชันพร้อมใช้

crontab
0 0 28-31 * * [ "$(date -d tomorrow +\%d)" = 01 ] && /path/to/command

เพิ่มบรรทัดนี้ด้วย crontab -e งานจะรันตามเขตเวลาของเซิร์ฟเวอร์ เว้นแต่ตั้งค่า CRON_TZ หรือ TZ

Kubernetes CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
  name: last-day-of-month
spec:
  schedule: "0 0 28-31 * *"
  timeZone: "Etc/UTC"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: job
              image: busybox:1.36
              command: ["/bin/sh", "-c", "date; echo run"]

ตั้งค่า spec.timeZone (Kubernetes 1.27 ขึ้นไป) หากไม่ตั้ง ตารางเวลาจะใช้เขตเวลาของ controller manager ซึ่งมักเป็น UTC

GitHub Actions
on:
  schedule:
    - cron: '0 0 28-31 * *'
  workflow_dispatch:

GitHub Actions ใช้ UTC เสมอ รับช่วงห่างตั้งแต่ 5 นาทีขึ้นไป และอาจเริ่มงานตามกำหนดช้าเมื่อระบบมีภาระสูง

Quartz
0 0 0 L * ?

Quartz วางวินาทีไว้หน้าสุด และต้องใส่ ? ในฟิลด์วันที่หรือวันในสัปดาห์ วันในสัปดาห์นับ 1–7 เริ่มจากวันอาทิตย์ จึงควรใช้ชื่อย่อแทน

Spring
@Scheduled(cron = "0 0 0 L * *")

Spring @Scheduled(cron = …) ใช้หกฟิลด์: วินาที แล้วตามด้วยห้าฟิลด์ปกติ

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

› ทำไมต้องเขียน % เป็น \% ใน crontab

ในบรรทัด crontab เครื่องหมาย % หมายถึงขึ้นบรรทัดใหม่ (อินพุตของคำสั่ง) ต้องเขียน \% เพื่อให้รูปแบบวันที่ส่งถึง shell ได้ครบถ้วน

› 0 0 28-31 * * รันตามเขตเวลาใด

Cron ใช้เขตเวลาของเครื่องหรือบริการที่รันมัน บน Linux คือเขตเวลาของระบบ เว้นแต่ตั้ง CRON_TZ หรือ TZ; CronJob ของ Kubernetes รองรับ spec.timeZone; GitHub Actions ใช้ UTC เสมอ

› จะตรวจสอบตารางเวลานี้ก่อนนำไปใช้จริงได้อย่างไร

เปิด 0 0 28-31 * * ในเครื่องมือแยกวิเคราะห์ Cron ของเว็บไซต์นี้ เครื่องมือจะอธิบายแต่ละฟิลด์และแสดงเวลารันที่จะมาถึงตามเวลาท้องถิ่นหรือ UTC ทั้งหมดในเบราว์เซอร์