แปลคำสั่ง crontab เป็นประโยคไทย บอก 5 เวลาที่จะรันถัดไป พร้อมเตือนกับดักเซิร์ฟเวอร์ UTC ที่ทำให้งานรันคลาด 7 ชั่วโมง
สมัครฟรีในไม่ถึงนาที ไม่ต้องใส่บัตรเครดิต · เก็บประวัติงานของคุณให้อัตโนมัติ
boltสมัครฟรี — ใช้ได้ทันทีเพราะเซิร์ฟเวอร์ที่เช่าจากต่างประเทศอย่าง DigitalOcean AWS Vultr หรือ Linode ตั้งนาฬิกาเครื่องเป็น UTC มาตั้งแต่แรก และ cron อ่านเวลาจากนาฬิกาของเครื่องเท่านั้น ไม่ได้อ่านจากเวลาที่เราคิดในหัว เวลาไทยเร็วกว่า UTC อยู่ 7 ชั่วโมง ตั้ง 09:00 บนเครื่อง UTC จึงไปตรงกับ 16:00 น. บ้านเรา ตรวจของจริงได้ด้วยคำสั่ง timedatectl ถ้าขึ้นว่า Time zone: Etc/UTC แปลว่าเจอกับดักนี้เข้าแล้ว ทางแก้ที่อ่านง่ายที่สุดคือใส่บรรทัด CRON_TZ=Asia/Bangkok ไว้เหนือรายการ cron แล้วเขียนเวลาเป็นเวลาไทยตรง ๆ ได้เลย ไม่ต้องนั่งลบ 7 ในหัวทุกครั้ง อีกทางคือตั้งเขตเวลาทั้งเครื่องด้วย sudo timedatectl set-timezone Asia/Bangkok แต่ต้องระวังว่าล็อกและงานอื่นบนเครื่องจะเปลี่ยนเขตเวลาตามไปด้วยทั้งหมด
นี่คือกฎที่คนเข้าใจผิดกันมากที่สุดของ cron ถ้าช่องที่ 3 (วันที่ในเดือน) และช่องที่ 5 (วันในสัปดาห์) ไม่ใช่ดาวทั้งคู่ cron จะรันเมื่อ “ตรงอันใดอันหนึ่ง” ไม่ใช่ต้องตรงทั้งคู่ คำสั่ง 0 0 1 * 1 จึงรันทั้งวันที่ 1 ของทุกเดือน และรันทุกวันจันทร์อีกต่างหาก รวมกันเดือนละห้าหกครั้ง ไม่ใช่เฉพาะวันที่ 1 ที่บังเอิญเป็นวันจันทร์ ถ้าอยากได้เงื่อนไข “ต้องตรงทั้งคู่” cron ทำตรง ๆ ไม่ได้ ต้องปล่อยช่องหนึ่งเป็นดาว แล้วไปกรองอีกเงื่อนไขในคำสั่งเอง เช่น อยากได้ศุกร์ที่สามของเดือนให้ใส่ช่วงวันที่ 15-21 ในช่องที่ 3 แล้วต่อท้ายคำสั่งด้วยการเช็คว่าวันนี้เป็นวันศุกร์หรือไม่ก่อนค่อยทำงานจริง
เขียนในบรรทัดเดียวไม่ได้ เพราะ cron นับ step อยู่ภายในช่องของตัวเองเท่านั้น ไม่ข้ามไปช่องถัดไป การเขียนดาวทับ 90 ในช่องนาทีจึงเหลือค่าเดียวคือนาทีที่ 0 ไม่ได้แปลว่าทุกชั่วโมงครึ่ง ถ้าต้องการทุก 90 นาทีจริง ๆ ต้องเขียนสองบรรทัดคู่กันคือ 0 0,3,6,9,12,15,18,21 * * * กับ 30 1,4,7,10,13,16,19,22 * * * ส่วน “ศุกร์ที่ 3 ของเดือน” หรือ “วันสุดท้ายของเดือน” เป็นรูปแบบของ Quartz กับ Spring (ตัวอักษร L W และเครื่องหมายชาร์ป) ซึ่ง crontab ของ Linux ไม่รู้จัก ต้องใช้วิธีกำหนดช่วงวันที่ให้กว้างไว้ก่อนแล้วเช็คเงื่อนไขที่เหลือในสคริปต์แทน เครื่องมือนี้จะบอกให้ทันทีถ้าตรวจพบรูปแบบที่ไม่ใช่ของ Linux
ในไฟล์ crontab เครื่องหมายเปอร์เซ็นต์มีความหมายพิเศษคือ “ขึ้นบรรทัดใหม่” คำสั่งจะถูกตัดตรงตำแหน่งนั้นทันที ส่วนที่เหลือกลายเป็นข้อมูลที่ป้อนเข้าโปรแกรมแทน สคริปต์สำรองข้อมูลที่ตั้งชื่อไฟล์ด้วยวันที่จึงพังกันบ่อยมาก เพราะรูปแบบวันที่ใช้เปอร์เซ็นต์เต็มไปหมด วิธีแก้คือใส่แบ็กสแลชนำหน้าเปอร์เซ็นต์ทุกตัวในบรรทัด crontab หรือย้ายคำสั่งทั้งก้อน ไปไว้ในไฟล์สคริปต์แยกแล้วให้ cron เรียกไฟล์นั้นแทน ซึ่งเป็นวิธีที่แนะนำกว่า เพราะทดสอบง่าย และไม่ต้องคอยหนีอักขระพิเศษทุกครั้งที่แก้
ไม่ถูกส่งไปไหนเลย การอ่านคำสั่ง คำนวณเวลาที่จะรัน และแปลงเขตเวลาทั้งหมด ทำด้วยจาวาสคริปต์ในเบราว์เซอร์ของคุณเอง ไม่มีการอัปโหลด ไม่นับโควตา และใช้ได้ไม่จำกัดจำนวนครั้ง จึงวางบรรทัด crontab ที่มีพาธจริงบนเซิร์ฟเวอร์ ชื่อโฮสต์ หรือคีย์ที่ติดอยู่ท้ายคำสั่งได้อย่างปลอดภัย ปิดหน้าเว็บเมื่อไหร่ข้อมูลก็หายไปพร้อมกัน