ไวยากรณ์ของ Crontab การใช้ตัวกำหนดเวลา cron ใน Linux การดำเนินการ Cron ทุกนาที

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

สำหรับงานเหล่านี้ Linux ใช้บริการระบบ cron นี่คือตัวกำหนดตารางเวลาที่ช่วยให้คุณสามารถรันสคริปต์ที่คุณต้องการได้ชั่วโมงละครั้ง วันละครั้ง สัปดาห์หรือเดือน ตลอดจนเวลาใดก็ได้ที่คุณระบุหรือตามช่วงเวลาใดก็ได้ โปรแกรมนี้มักจะถูกใช้โดยบริการระบบปฏิบัติการอื่น ๆ ในบทความนี้เราจะดูวิธีกำหนดค่า Cron และดูตัวอย่างหลักที่ใช้บ่อย

ในความเป็นจริง Cron เป็นบริการเช่นเดียวกับบริการ Linux อื่นๆ โดยเริ่มต้นเมื่อเริ่มต้นระบบและทำงานในเบื้องหลัง หน้าที่หลักคือดำเนินกระบวนการที่ถูกต้องในเวลาที่เหมาะสม มีไฟล์การกำหนดค่าหลายไฟล์ซึ่งจะใช้ข้อมูลเกี่ยวกับสิ่งที่ต้องทำและเมื่อใด บริการจะเปิดไฟล์ /etc/crontab ซึ่งมีข้อมูลที่จำเป็นทั้งหมด บ่อยครั้งในการแจกแจงสมัยใหม่มีการกำหนดให้เรียกใช้ยูทิลิตี้ run-parts ซึ่งเรียกใช้สคริปต์ที่จำเป็นจากโฟลเดอร์ต่อไปนี้:

  • /etc/cron.นาที- ทุกนาที
  • /etc/cron.hourly- ทุกชั่วโมง
  • /etc/cron.daily- ทุกวัน;
  • /etc/cron.weekly- ทุกสัปดาห์
  • /etc/cron.monthly- ทุกเดือน

โฟลเดอร์เหล่านี้ควรมีสคริปต์ที่ต้องดำเนินการตามช่วงเวลาที่กำหนด สคริปต์ต้องมีสิทธิ์ดำเนินการและชื่อต้องไม่มีจุด ทำให้การทำงานกับตัวกำหนดเวลาเป็นเรื่องง่ายมากสำหรับผู้ใช้ใหม่ นอกจากนี้ในไฟล์ crontab ยังมีการเปิดตัวคำสั่ง anacron ซึ่งทำงานเหมือนกับ cron เฉพาะมีไว้สำหรับงานที่ต้องทำครั้งเดียวในระยะเวลานาน เช่น วันละครั้ง สัปดาห์ เดือน ปี

ช่วยให้คุณสามารถดำเนินการได้แม้ว่าคอมพิวเตอร์จะไม่ทำงานเสมอไปและปิดอยู่เป็นครั้งคราว วันที่ที่งานถูกดำเนินการครั้งล่าสุดจะถูกบันทึกไว้ในไฟล์ /var/spool/anacron จากนั้นในครั้งถัดไปที่งานเริ่มต้น Anacron จะตรวจสอบเพื่อดูว่ากระบวนการที่ต้องการทำงานในเวลาที่ถูกต้องหรือไม่ และหากไม่เป็นเช่นนั้น ก็จะเริ่มทำงาน . บริการ cron นั้นได้รับการออกแบบมาให้ทำงานในระหว่างวันหรือตามกำหนดเวลาและวันที่ที่แม่นยำยิ่งขึ้น

การตั้งค่า Cron

ในการกำหนดค่าเวลา วันที่ และช่วงเวลาที่จำเป็นต้องดำเนินการงาน จะใช้ไวยากรณ์ไฟล์ cron พิเศษและคำสั่งพิเศษ แน่นอน คุณสามารถแก้ไขไฟล์ /etc/crontab ได้ตลอดเวลา แต่ไม่แนะนำ มีคำสั่ง crontab แทน:

ขอแนะนำให้ดำเนินการด้วยตัวเลือก -e เสมอ จากนั้นโปรแกรมแก้ไขข้อความเริ่มต้นของคุณจะถูกนำมาใช้ในการแก้ไขกฎ คำสั่งจะเปิดไฟล์ชั่วคราวซึ่งมีกฎ cron ปัจจุบันทั้งหมดอยู่แล้ว และคุณสามารถเพิ่มกฎใหม่ได้ หลังจากคำสั่ง cron เสร็จสิ้น ไฟล์จะถูกประมวลผลและกฎทั้งหมดจะถูกเพิ่มไปที่ /var/spool/cron/crontabs/username และกระบวนการที่เพิ่มเข้ามาจะถูกเรียกใช้จากผู้ใช้ที่คุณเพิ่มเข้ามาทุกประการ

ดังนั้นคุณต้องใช้ความระมัดระวังที่นี่ และหากคุณต้องการรันสคริปต์ในฐานะรูท crontab จะต้องดำเนินการในฐานะรูท ไม่ใช่ในฐานะผู้ใช้ ซึ่งมักจะทำให้เกิดปัญหา

ไวยากรณ์ของ crontab

ดังที่ได้กล่าวไปแล้ว เวลาถูกตั้งค่าในรูปแบบพิเศษ มาดูไวยากรณ์สำหรับการตั้งค่า cron งานเดียว:

นาที ชั่วโมง วัน เดือน วัน_สัปดาห์ /path/to/executable/file

ต้องบอกว่าคุณต้องเขียนเส้นทางแบบเต็มไปยังคำสั่ง เนื่องจากสำหรับคำสั่งที่ทำงานเป็น cron ตัวแปรสภาพแวดล้อม PATH จะแตกต่างออกไป และบริการจะไม่สามารถค้นหาคำสั่งของคุณได้ นี่เป็นสาเหตุที่พบบ่อยเป็นอันดับสองของปัญหากับ Cron วันที่และเวลาระบุด้วยตัวเลขหรือสัญลักษณ์ "*" สัญลักษณ์นี้หมายความว่าจะต้องดำเนินการทุกครั้ง หากอยู่ในฟิลด์แรก - จากนั้นทุกนาทีเป็นต้น ทีนี้มาดูตัวอย่างกันดีกว่า

ตัวอย่างการตั้งค่า cron

ขั้นแรก คุณสามารถดูงาน cron สำหรับ superuser ได้ ซึ่งคุณสามารถใช้ตัวเลือก -l ได้:

คุณสามารถลบงานที่มีอยู่ทั้งหมดด้วยคำสั่ง -r:

สมมติว่าเราจำเป็นต้องรันสคริปต์ของเราที่ /usr/local/bin/serve ในฐานะ superuser สคริปต์การบำรุงรักษาบางประเภท ตัวอย่างที่ง่ายที่สุดคือการรันทุกนาที:

* * * * * /usr/local/bin/serve

0 * * * * /usr/local/bin/serve

เราเปิดตัวที่ศูนย์นาทีของศูนย์ชั่วโมง ทุกวัน เวลา 12.00 น.:

0 0 * * * /usr/local/bin/serve

0 0 1 * * /usr/local/bin/serve

คุณสามารถทำได้ทุกวันเช่นวันที่ 15:

0 0 15 * * /usr/local/bin/serve

ในวันแรกของสัปดาห์ของเดือนแรกของปี 0 ชั่วโมง 0 นาที:

0 0 * 1 0 /usr/local/bin/serve

หรือวันที่ศูนย์ของสัปดาห์ในแต่ละเดือน:

0 0 * * 0 /usr/local/bin/serve

คุณสามารถเลือกนาที ชั่วโมง และวันในสัปดาห์ได้ เช่น 15.30 น. ของวันอังคาร:

30 15 * * 2 /usr/local/bin/serve

วันจันทร์ถือเป็นวันแรก วันอาทิตย์เป็นวันที่เจ็ดหรือวันที่ศูนย์ คุณยังสามารถเขียนชื่อย่อสำหรับวันในสัปดาห์ได้ เช่น วันอาทิตย์ - วันอาทิตย์:

30 15 * * อาทิตย์ /usr/local/bin/serve

เพื่อระบุช่วงเวลาที่เฉพาะเจาะจง คุณต้องใช้สัญลักษณ์ "-" เช่น ทุกชั่วโมง ตั้งแต่เจ็ดโมงเช้าถึงเจ็ดโมงเย็น:

0 7-19 * * * /usr/local/bin/serve

หากคุณต้องการรันคำสั่งหลายครั้ง คุณสามารถใช้ตัวคั่น "," ได้ ตัวอย่างเช่น ให้รันสคริปต์ที่ 5 และ 35 นาทีหลังจากห้า (16:05 และ 16:35 น.) ทุกวัน:

5.35 16 * * * /usr/local/bin/serve

คุณอาจไม่ต้องการระบุเวลาแยกกัน แต่เพียงระบุช่วงเวลาที่คุณต้องการให้สคริปต์ทำงาน เช่น หนึ่งครั้งทุกๆ 10 นาที เมื่อต้องการทำเช่นนี้ ให้ใช้ตัวคั่นด้วยเครื่องหมายทับ - "/":

*/10 * * * * /usr/local/bin/serve

นอกจากนี้ ได้มีการคิดค้นตัวแปรสำหรับชุดที่ใช้กันทั่วไปบางชุด ดังนี้

  • @รีบูต- เมื่อโหลดเพียงครั้งเดียว
  • @รายปี, @รายปี- ปีละครั้ง
  • @รายเดือน- เดือนละครั้ง
  • @รายสัปดาห์- สัปดาห์ละครั้ง
  • @ทุกวัน, @เที่ยงคืน- ทุกวัน;
  • @รายชั่วโมง- ทุกชั่วโมง

ตัวอย่างเช่น คำสั่งให้รันสคริปต์ชั่วโมงละครั้งมีลักษณะดังนี้:

@รายชั่วโมง /usr/local/bin/serve

หากคุณกำลังจะเพิ่มสคริปต์ลงในโฟลเดอร์ใดโฟลเดอร์หนึ่ง อย่างที่ฉันได้กล่าวไปแล้ว คุณต้องให้ชื่อสคริปต์ไม่มีจุดและมีสิทธิ์ดำเนินการ:

sudo vi /etc/corn.daily/basckup

สคริปต์ควรมีลักษณะเช่นนี้ ตอนนี้คุณรู้วิธีตั้งค่า cron แล้ว สิ่งที่เหลืออยู่คือการตรวจสอบว่าทุกอย่างทำงานอย่างไร

งานแก้จุดบกพร่อง

หลังจากที่คุณตั้งค่ากฎแล้ว คุณต้องการตรวจสอบด้วยว่ากฎเหล่านั้นใช้ได้ผลหรือไม่ ในการดำเนินการนี้ เราจะรอเวลาที่สคริปต์ควรจะถูกเรียกใช้งานแล้วและดูที่บันทึกของ cron บางครั้งมันอยู่ใน /var/log/cron และบางครั้งก็เขียนไปที่ syslog ตัวอย่างเช่น ฉันมีบรรทัดนี้ใน crontab:

ควรดำเนินการเวลา 19.40 น. ทุกวัน ตอนนี้ดูที่บันทึก:

grep CRON /var/log/syslog.php

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

หากคุณต้องการตรวจสอบสคริปต์ที่อยู่ในโฟลเดอร์พิเศษโฟลเดอร์ใดโฟลเดอร์หนึ่ง จะง่ายยิ่งขึ้นไปอีก เพียงเรียกใช้ run-path ส่งโฟลเดอร์ที่ต้องการ หรือแม้แต่สคริปต์เองเป็นพารามิเตอร์:

sudo run-paths /etc/cron.daily/

ข้อสรุป

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

ฉันได้ยินมามากมายเกี่ยวกับวิธีที่ Linux มีตัวกำหนดเวลางาน cron ที่มีประโยชน์ อย่างไรก็ตาม ฉันไม่จำเป็นต้องใช้มัน และฉันไม่ต้องการที่จะเข้าใจการตั้งค่าของมัน... คอนโซล ตัวอักษรภาษาอังกฤษจำนวนมาก... มันน่ากลัว แต่โชคดีที่ความกลัวของฉันก็ไร้ผล - ทุกอย่างเรียบง่ายตั้งแต่พื้นฐานเลย บทความนี้จะกล่าวถึงวิธีตั้งค่าการทำงานของสคริปต์ของคุณตามกำหนดเวลาและเราจะติดตั้ง "นกกาเหว่า" เป็นตัวอย่าง

ก่อนอื่น เล็กน้อยเกี่ยวกับวิธีการทำงานโดยทั่วไป

เมื่อระบบเริ่มทำงาน cron daemon จะเริ่มทำงาน สามารถควบคุมได้ (หยุด/เริ่ม/ตรวจสอบสถานะ) ด้วยคำสั่ง: sudo service cron (หยุด/เริ่ม/สถานะ) แต่นี่ไม่ค่อยจำเป็น

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

งานจะอยู่ในไฟล์ที่มีชื่อเท่ากับชื่อผู้ใช้ และตัวไฟล์เองจะอยู่ในโฟลเดอร์ /var/spool/cron/crontabs โฟลเดอร์นี้ได้รับการปกป้องจากการรบกวนจากภายนอก และมีเพียงผู้ใช้ขั้นสูงเท่านั้นที่สามารถเข้าถึงได้ แต่ผู้ใช้แต่ละคนสามารถกำหนดเวลาสำหรับงานของตนได้โดยไม่ต้องรู้รหัสผ่านรูท (superuser)

ถึง ตั้งค่าครอนสำหรับผู้ใช้ทั่วไป เพียงพิมพ์:

หากคุณต้องการสร้างงานให้กับผู้ใช้รายอื่น ให้เปิดใช้งานด้วยคำสั่ง:

sudo crontab -u ผู้ใช้ -e

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


ไวยากรณ์สำหรับงานนั้นง่ายมาก ลองดูตัวอย่างจากภาพหน้าจอของการเปิดตัวนกกาเหว่า:

0 */1 * * * /home/zegi/bin/kuku

งานมี 2 ฟิลด์หลัก: 0 */1 * * * - ระบุเวลาที่คำสั่งจะถูกทริกเกอร์ และ /home/zegi/bin/kuku คือเส้นทางไปยังสคริปต์ที่อธิบายคำสั่ง

ไม่ควรมีปัญหาใดๆ กับที่อยู่ในสคริปต์ (zegi คือชื่อผู้ใช้... อย่าลืมใส่ของคุณ) แต่เราต้องอธิบายวิธีตั้งเวลา cron สำหรับการเรียกใช้สคริปต์

โดยรวมแล้วเรามีเซลล์อินพุต 5 เซลล์ซึ่งคั่นด้วยช่องว่าง
1 - นาที (ตัวเลขตั้งแต่ 0 ถึง 59)
2 - ชั่วโมง (ตั้งแต่ 0 ถึง 23)
3 - วันของเดือน (ตั้งแต่ 1 ถึง 31)
เดือนที่ 4 ของปี (ตั้งแต่ 1 ถึง 12... เช่น กุมภาพันธ์ คือ 2)
5 - วันในสัปดาห์ (ตั้งแต่ 1 ถึง 7 ใช้สัปดาห์ตะวันตกเมื่อเริ่มต้นคือวันอาทิตย์ เช่น อาทิตย์-1, จันทร์-2, อังคาร-3, พุธ-4, พฤหัสบดี-5, ศุกร์-6, วันเสาร์ - 7)

ต้องกรอกแต่ละเซลล์ หากคุณต้องการให้ดำเนินการคำสั่งทุกเดือน ให้ตั้งค่า * ในสนามที่ 4 เช่นเดียวกับฟิลด์อื่นๆ

กลับไปที่ตัวอย่างนกกาเหว่าเมื่อสคริปต์ทำงานทุกชั่วโมง เพื่อกำหนดความถี่ในการใช้งาน / - ตัวอย่างเช่น หากคุณต้องการให้งานดำเนินการทุกๆ 5 นาทีในวันจันทร์ ให้ตั้งค่า:

หากคุณต้องการให้งานถูกดำเนินการทุกชั่วโมง คุณจะต้องกำหนดนาทีที่เจาะจง หากคุณทิ้งเครื่องหมายดอกจัน (* */1 * * *) เม็ดมะยมจะดำเนินการทุกนาที - เนื่องจากตรงตามเงื่อนไข: มีการตรวจสอบทั้ง 5 เซลล์และค่าของมันสอดคล้องกับเวลาปัจจุบัน (นาที - มันไม่สำคัญ ชั่วโมง - ทุกชั่วโมง ไม่ใช่แค่บางชั่วโมง)
เครื่องหมายทับจะต้องนำหน้าด้วยเครื่องหมายดอกจันเสมอ ตัวอย่างเช่น การกำหนดการดำเนินการทุกนาทีเริ่มตั้งแต่วันที่ 30 ด้วยการป้อน 30/1 จะไม่ทำงาน

หากจำเป็นสำหรับการทำงานที่ไม่เป็นวงกลม แต่หลายครั้งค่าจะถูกเขียนโดยคั่นด้วยเครื่องหมายจุลภาค
เช่น คุณต้องทำงานให้เสร็จในวันธรรมดาเวลา 12.00 น. และ 18.00 น. จากนั้นจะมีลักษณะดังนี้:

* 12,18 * * 2,3,4,5,6

เมื่อคุณแก้ไขงานเสร็จแล้ว อย่าลืมบันทึกการเปลี่ยนแปลง (Ctrl+O > Enter) จากนั้นคุณก็สามารถออกได้ (Ctrl+x)

Cron ควรแจ้งว่ามีงานใหม่ปรากฏขึ้นและพร้อมที่จะดำเนินการโดยเขียนว่า: “crontab: กำลังติดตั้ง crontab ใหม่”

คุณสามารถดูงานที่สร้างขึ้น (บางทีคุณอาจไม่ได้ทำอะไรเพื่อตัวคุณเอง แต่ผู้ดูแลระบบเครือข่ายกำหนดค่าบางอย่างให้กับคุณ) ด้วยคำสั่ง:

และสุดท้ายฉันก็เอง สคริปต์นกกาเหว่าซึ่งนกกาเหว่าทุกชั่วโมง:

#!/bin/bash
ชั่วโมง=`วันที่ +%l`
ในขณะที่ [ $h -gt 0 ]
ทำ
เล่น ~/kukushka.wav
ชั่วโมง=$[$h-1]
เสร็จแล้ว

คุณสามารถดาวน์โหลดเสียงนกกาเหว่าด้วยคำสั่ง:

รับ http://dl.dropbox.com/u/24844052/tuksik/kukushka.wav

การเล่นรวมอยู่ในแพ็คเกจ sox ใน Ubuntu คุณสามารถติดตั้งได้ด้วยคำสั่ง

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

ครอน– มีการใช้บริการ daemon ลินุกซ์/ยูนิกซ์ระบบเป็นตัวกำหนดเวลางาน daemon ช่วยให้คุณสามารถเรียกใช้สคริปต์เพื่อดำเนินการได้เป็นระยะ

ไฟล์ที่สร้างขึ้นจะถูกวางไว้ในไดเร็กทอรี:
/usr/spool/cron/crontabs หรือ /var/spool/cron/tabs
คุณเพียงแค่ต้องแก้ไขมันด้วยการรัน crontab –e
สามารถวางไฟล์ไว้ในไดเร็กทอรีต่อไปนี้ ทั้งนี้ขึ้นอยู่กับระยะเวลาดำเนินการ:
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

การสร้างงาน cron
สร้างงานใน โครนแท็ปดูเหมือนกรอกช่องที่ต้องกรอก 6 ช่อง ความหมายมีดังนี้
1. นาที – ตัวเลขตั้งแต่ 0-59
2. ชั่วโมง – ตัวเลขตั้งแต่ 0-23
3. วันของเดือน – ตัวเลขตั้งแต่ 1-31
4. จำนวนเดือนในปี – ตัวเลขตั้งแต่ 1-12
5. วันในสัปดาห์ – ตัวเลขตั้งแต่ 0-7
0-วันอาทิตย์, 1-วันจันทร์, 2-วันอังคาร, 3-วันพุธ, 4-วันพฤหัสบดี, 5-วันศุกร์, 6-วันเสาร์
สำหรับแต่ละพารามิเตอร์ข้างต้นสามารถตั้งค่าต่อไปนี้ได้:
ก) คั่นด้วยเครื่องหมายจุลภาค - 3,7,9 (ในช่องวันที่ของเดือน 3,7,9 ตามลำดับ)
b) ยัติภังค์ – 3-9 (ในช่องชั่วโมงจะหมายถึงการดำเนินการที่ 3,4,5,6,7,8,9)
c) * - จะถูกดำเนินการในค่าที่เป็นไปได้ทั้งหมด
d) / - การตั้งค่าช่วงเวลางานเพิ่มเติม - */8 ในช่องนาที จะดำเนินการทุก ๆ แปดนาที

วิธีการรันงาน ครอนเมื่อระบบบูท เพื่อรันสคริปต์เมื่อระบบบูท ลินุกซ์มีการใช้คีย์เวิร์ดรีบูต ตัวอย่างเช่น:

นอกจากนี้ คุณสามารถใช้คำสำคัญต่อไปนี้:
@yearly – เหมือนกับ 0 0 1 1 * (ปีละครั้ง)
@daily – เหมือนกับ 0 0 * * * (วันละครั้ง)
@hourly – เท่ากับ 0 * * * * (หนึ่งครั้งต่อชั่วโมง)

คำสั่งสำหรับจัดการ crontab
- ดูงานสำหรับบัญชีปัจจุบัน
crontab –l
- ดูงานสำหรับบัญชีที่ต้องการ
crontab –u ชื่อผู้ใช้ –l
- การแก้ไขงาน cron
crontab –e
- การแก้ไขงาน cron สำหรับผู้ใช้ที่กำหนด
crontab –u ชื่อผู้ใช้ –e

ตัวอย่างงาน cron:
ทำงานให้เสร็จเวลา 7.00 น. ทุกวัน
0 7 * * * รูท /home/scripts/mount.sh
ทำงานให้เสร็จเวลา 17.30 น. ทุกวัน
30 17 * * * รูท /home/scripts/mount.sh
ทำงานให้เสร็จทุกเดือนในวันแรกเวลา 0 ชั่วโมง 0 นาที
0 0 1 * * รูท /home/scripts/mount.sh
ทำภารกิจให้สำเร็จทุก 4 ชั่วโมง
* * /4 * * * รูท /home/scripts/mount.sh
รันงานเมื่อบู๊ต ลินุกซ์
@reboot รูท /home/scripts/mount.sh

การตั้งค่า cron เพิ่มเติม
เพื่อรับรายงานการปฏิบัติงาน ครอนคุณสามารถกำหนดตัวแปร MAIL ได้ที่จุดเริ่มต้น ครอนสคริปต์
MAIL=mail.mail.local
ตามค่าเริ่มต้น ตัวอักษรจะมีข้อความทั้งหมดที่สคริปต์ส่งออก เพื่อป้องกันไม่ให้สิ่งนี้เกิดขึ้น คุณต้องเพิ่ม > /dev/null 2>&1 ในงาน cron ของสคริปต์
หากต้องการปิดใช้งานการรับข้อความจาก cron คุณต้องปล่อยตัวแปร MAIL ไว้โดยไม่ได้ตั้งค่า
เมล=””
คุณสามารถกำหนดเส้นทางไปยังไฟล์ด้วยสคริปต์โดยใช้ตัวแปร PATH เป็นต้น
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/home/scripts ใน crontab จะอนุญาตให้คุณเขียนในบรรทัดพารามิเตอร์งาน
@ รีบูตรูท mount.sh
การรันสคริปต์ผ่าน cron โดยใช้ล่าม php
* 1 * * * /usr/local/bin/php – q mount.sh > /dev/null 2>&1
/usr/local/bin/wget –O /dev/null –q http://"site.com/cron.php?action=123"

การแนะนำ

ด้วยการโฮสต์เว็บไซต์ เราต้องการให้แน่ใจว่าการดำเนินงานจะต่อเนื่องโดยที่เราไม่ต้องมีส่วนร่วม

ซึ่งหมายความว่าคุณต้องทำให้กระบวนการเป็นแบบอัตโนมัติ และนี่คือ cron ที่เข้ามาช่วยเหลือ

ครอน- โปรแกรม daemon สำหรับเรียกใช้โปรแกรมและสคริปต์บนเซิร์ฟเวอร์โดยอัตโนมัติในเวลาที่กำหนด

Crontab ในแผงควบคุม Timeweb

หากบัญชีของคุณได้รับการชำระเงินแล้วและคุณไม่ถูกตรวจจับว่าเป็นสแปม ส่วน Crontab จะพร้อมใช้งานและใช้งานได้:

อินเทอร์เฟซ Crontab ในแผงควบคุม Timeweb นั้นเป็นมิตรและใช้งานง่าย แม้แต่ผู้ใช้มือใหม่ที่ไม่เคยมีประสบการณ์กับ cron มาก่อนก็สามารถหาวิธีสร้างงานได้อย่างง่ายดาย ด้วยการสร้างงาน คุณสามารถสำรองข้อมูล ส่งเมล ล้างแคช และดำเนินการมาตรฐานอื่นๆ ได้โดยอัตโนมัติ

Crontab ในแผงควบคุม Timeweb จะช่วยให้ผู้ใช้ทำงานอัตโนมัติและบรรลุผลลัพธ์ที่ต้องการ

หลังจากข้อมูลพื้นฐานแล้ว ฉันจะพูดถึงความแตกต่างที่สำคัญที่ต้องพิจารณาเมื่อทำงานกับ cron

งานใหม่จะถูกสร้างขึ้นในส่วน Crontab ในการดำเนินการนี้ คุณจะต้องกรอกข้อมูลในช่องต่อไปนี้:

  • ชื่อ- นี่คือชื่องานของเรา
  • ประเภทไฟล์และ เส้นทางไปยังไฟล์- ขึ้นอยู่กับภาษาที่ใช้เขียนสคริปต์ ให้เลือกประเภทไฟล์และเส้นทางไปยังไฟล์นั้นหากงานเรียกใช้สคริปต์ที่ต้องใช้ตัวแปรเว็บเซิร์ฟเวอร์ การเรียกใช้งานโดยตรงผ่านล่าม PHP จะส่งผลให้เกิดข้อผิดพลาด ดังนั้นในกรณีที่คุณใช้สคริปต์ที่ทำงานเมื่อเปิดผ่านแถบที่อยู่ของเบราว์เซอร์ คุณต้องเลือกประเภทไฟล์ "คำขอ HTTP" และระบุ URL สำหรับคำขอในลักษณะเดียวกับที่ระบุไว้ในที่อยู่ แถบ "your_site/path/to/script/script .php?parameter1=value1¶meter2=value2"

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

ความแตกต่าง

ความแตกต่างเล็กน้อยที่ควรค่าแก่การจดจำเมื่อทำงานกับ cron

1. Cron ใช้งานได้หากบัญชีได้รับการชำระและไม่มีข้อจำกัด

คุณสามารถตรวจสอบสถานะได้โดยสร้างไฟล์ที่มีนามสกุล php (เช่น twtest.php) ด้วยโค้ด:

และการเข้าถึงไฟล์ในเบราว์เซอร์

ในเบราว์เซอร์คุณจะเห็นข้อมูลต่อไปนี้:

uid=12345(เข้าสู่ระบบ) gid=600(ลูกค้า) กลุ่ม=600(ลูกค้า) - ระบุว่ามี cron และเมล

uid=12345(เข้าสู่ระบบ) gid=600(ลูกค้า) กลุ่ม=601(ลูกค้าใหม่),600(ลูกค้า),660(ผู้ส่งอีเมลขยะ) - เขียนเพื่อสนับสนุน

2. ไฟล์ที่คุณกำลังเรียกใช้จะต้องมีสิทธิ์ในการอ่านและดำเนินการ (r+x)

ตามค่าเริ่มต้น ไฟล์บนโฮสติ้งจะถูกสร้างขึ้นด้วยสิทธิ์ 600 คุณสามารถเปลี่ยนสิทธิ์เป็นสิทธิ์ที่ต้องการได้ผ่าน ssh ด้วยคำสั่ง:

Chmod 744 twtest.php

หรือในตัวจัดการไฟล์ Timeweb มีคำแนะนำเกี่ยวกับสิ่งนี้:

3. เพื่อไม่ให้อีเมลของคุณเกะกะด้วยตัวอักษรที่ไม่จำเป็นกำหนดค่าสคริปต์ที่ทำงานบ่อยเพื่อเขียนบันทึกลงในไฟล์และไม่ใช่ไปที่คอนโซล

CRON บน SSH

มีการอธิบายการตั้งค่าตัวกำหนดเวลาผ่าน ssh หลายครั้งจนไม่สามารถบอกอะไรใหม่ได้

การเชื่อมต่อผ่าน ssh มีอธิบายไว้โดยละเอียดในศูนย์ช่วยเหลือของ Timeweb:

หลังจากอ่านแล้ว คุณจะต้องค้นหาไฟล์ที่มีสคริปต์ โดยย้ายไปมาระหว่างไดเร็กทอรีด้วยคำสั่ง cd เมื่อพบไฟล์แล้ว ให้ป้อน pwd และคัดลอกพาธ (ตัวอย่าง "/home/c/cc123456/public_html/test/")

หากคุณไม่ทราบว่าไฟล์มีสิทธิ์ใดบ้าง ให้ป้อน:

ชื่อไฟล์ Chmod 744

เมื่อเชื่อมต่อผ่าน ssh คุณสามารถแก้ไขงานด้วยคำสั่ง

Crontab -e

ครั้งแรกที่เซิร์ฟเวอร์จะขอให้คุณเลือกโปรแกรมแก้ไข:

เลือกเอดิเตอร์ หากต้องการเปลี่ยนแปลงในภายหลัง ให้เรียกใช้ "select-editor" 1. /bin/ed 2. /bin/นาโน<---- easiest 3. /usr/bin/mcedit 4. /usr/bin/vim.basic 5. /usr/bin/vim.tiny Choose 1-5 :

ระบบชี้ไปที่โปรแกรมแก้ไขนาโนแบบธรรมดาใต้หมายเลข 2 หากคุณไม่ได้คำนวณแรงหรือเลือก vi โดยไม่ตั้งใจ ไม่ต้องตกใจ กด Esc จากนั้นป้อนโคลอน q แล้วกด Enter

หากต้องการเปลี่ยนเอดิเตอร์ ให้ป้อนคำสั่ง:

เลือกตัวแก้ไข

และเลือกนาโน

งานจะเขียนทีละบรรทัด ตัวอย่าง:

1 2 3 4 5 /opt/php56/bin/php /home/с/сс123456/public_html/twtest.php

ความหมายของค่าห้าค่าแรก:

  • 1 นาที - ตัวเลขตั้งแต่ 0 ถึง 59
  • 2 ชั่วโมง - ตัวเลขตั้งแต่ 0 ถึง 23
  • วันที่ 3 ของเดือน - ตัวเลขตั้งแต่ 1 ถึง 31
  • หมายเลข 4 เดือนในปี - ตัวเลขตั้งแต่ 1 ถึง 12
  • วันที่ 5 ของสัปดาห์ - ตัวเลขตั้งแต่ 0 ถึง 7 (0-อาทิตย์,1-จันทร์,2-อังคาร,3-พุธ,4-พฤหัสบดี,5-ศุกร์,6-วันเสาร์,7-อาทิตย์)

สำหรับแต่ละพารามิเตอร์ คุณสามารถระบุจำนวนค่าที่ต้องการโดยคั่นด้วยเครื่องหมายจุลภาค ตัวอย่างเช่น หากคุณเขียน 8.23 ​​​​ในช่อง "ชั่วโมง" งานจะทำงานเวลา 8.00 น. และ 23.00 น. คุณสามารถตั้งช่วงเวลาได้: 9-18 หมายความว่าโปรแกรมจะเริ่มทุกชั่วโมงตั้งแต่ 9 ถึง 18 ชั่วโมง สัญลักษณ์ "*" หมายถึง "ค่าที่เป็นไปได้ทั้งหมด" ตัวอย่างเช่น การระบุ "*" ในช่อง "ชั่วโมง" จะหมายถึง "ทำงานทุกชั่วโมง" สัญลักษณ์ "/" ใช้เพื่อระบุความถี่เพิ่มเติมของงาน ตัวอย่างเช่น "*/3" ในช่อง "นาที" หมายถึง "ทุกสามนาที"

"/opt/php*/bin/php" โดยที่ php*/ = php53/ php5.3/ php54/ php5.4/ php56/ php5.6/ php70/ php7.0/ php71/ php7.1/

รายการสุดท้ายระบุเส้นทางไปยังไฟล์และชื่อของไฟล์ที่เรากำลังเปิดตัว

ความแตกต่าง

  1. เมื่อคุณทำการเปลี่ยนแปลงในแผงควบคุมในส่วน "Crontab" การเปลี่ยนแปลงรายการที่ทำผ่าน ssh จะถูกลบ!
  2. หากมีการกำหนดทั้งฟิลด์ "วันของเดือน" และ "วันในสัปดาห์" งานดังกล่าวจะถูกดำเนินการในแต่ละวันที่ระบุของสัปดาห์ โดยไม่คำนึงถึงวันของเดือน ตัวอย่างเช่น คำสั่งต่อไปนี้จะทำงานเวลา 9:19 น. ทุกวันพุธและทุกวันที่ 7 ของเดือน แม้ว่าวันที่ 7 จะไม่ใช่วันพุธเดียวกันก็ตาม

19 9 7 * 3 /opt/php56/bin/phpn /home/s/ss123456/public_html/twtest.php

กรณีพิเศษ

หากต้องการเรียกใช้งานบ่อยกว่าหนึ่งครั้งต่อนาที ให้ใช้โหมดสลีป

เมื่อต้องการทำสิ่งนี้ ให้เขียนใน crontab:

* * * * * /opt/php56/bin/php /home/k/konoplev/tmp/twtest.php; /bin/สลีป 30; /opt/php56/bin/php /home/k/konoplev/tmp/twtest.php

เพื่อรันไฟล์ทุกๆ 30 วินาที

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

ตัวเลือกเชิงตรรกะคือการสร้างไฟล์ล็อคและตรวจสอบการมีอยู่ของไฟล์เมื่อรันสคริปต์ แต่โฮสติ้งของ Timeweb ก็เหมือนกับไซต์โฮสติ้งอื่นๆ ตรงที่มีข้อจำกัดในการประมวลผล สคริปต์ขึ้นอยู่กับเงื่อนไขและเวลาดำเนินการ ซึ่งหมายความว่าเราไม่สามารถคาดเดาเวลาดำเนินการของสคริปต์ได้ หากสคริปต์ถูกดำเนินการโดยละเมิดกฎและข้อจำกัด ( ) จากนั้นกระบวนการจะสิ้นสุดที่ฝั่งโฮสติ้ง จากนั้นไฟล์ล็อคจะไม่ถูกลบ ซึ่งหมายความว่าสคริปต์จะไม่ถูกรันโดย cron จนกว่าไฟล์จะถูกลบ

เกจิจากแผนกวิศวกรรมอธิบายวิธีแก้ปัญหา

ขั้นแรก สร้างสคริปต์ sh ในไฟล์ /home/c/cc123456/tmp/twtest.sh:

#!/bin/bash คำสั่ง=$@ no_spaces=`echo $command | sed -e "s/\s/_/g" -e "s|/|_|g"` pidfile=/var/tmp/$no_spaces.pid lockfile=/var/tmp/$no_spaces.lockถ้า [[ -e $pidfile ]] แล้ว pid=`cat $pidfile 2>/dev/null` PS ชั่วโมง $pid >/dev/null 2>/dev/nullถ้า [[ $? -eq 0 ]] จากนั้นออกจาก 1 อื่น rm $lockfile fi fi echo $$ > $pidfile /usr/bin/flock -w 0 $lockfile $คำสั่ง RM $pidfile

ในแผงควบคุม ในส่วน crontab ให้เลือกประเภท "ไฟล์ไบนารีที่ปฏิบัติการได้"

ในช่อง "เส้นทางแบบเต็ม" เราเขียนว่า:

/home/c/cc123456/tmp/twtest.sh /opt/php56/bin/php /home/c/cc123456/tmp/twtest.php

ที่ไหน

  • /home/c/cc123456/tmp/twtest.sh - สคริปต์ทดสอบของเรา
  • /opt/php56/bin/php - เส้นทางไปยังล่ามที่ต้องการ
  • /home/c/cc123456/tmp/twtest.php - เส้นทางไปยังสคริปต์ของเรา

เราระบุเวลาเปิดตัวที่ต้องการและตั้งชื่อ

บทสรุป

ตอนนี้คุณรู้วิธีทำงานกับ cron และรันงานโดยอัตโนมัติแล้ว สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ cron โปรดดูที่ "man cron" ขอให้โชคดี!

สมมติว่าเราจำเป็นต้องทำงานบางอย่างทุกวัน หรืออาจจะทุกวันเสาร์ เวลา 00.00 น.? บนระบบที่คล้าย Unix เป็นไปได้ที่จะเปิดใช้งานงานซ้ำ ๆ โดยอัตโนมัติโดยใช้ daemon ตัวกำหนดเวลางาน cron บทความนี้จะครอบคลุมพื้นฐานการทำงานด้วย

ทุกอย่างที่อธิบายไว้ในบทความนี้ได้รับการทดสอบบน Linux Debian 6.0 squeeze แต่โดยส่วนใหญ่แล้วจะทำงานบนระบบปฏิบัติการที่คล้ายกับ Unix อื่นๆ ได้

คำสั่งพื้นฐาน

ในการจัดการตัวกำหนดเวลางาน ให้ใช้คำสั่ง crontab ด้วยคีย์ต่อไปนี้:

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

ดังนั้น ในการมอบหมายงานเฉพาะ คุณต้องรันคำสั่ง crontab -e และเขียนรายการงานที่ต้องการทีละบรรทัดตามไวยากรณ์ของ cron

ไวยากรณ์ครอน

โดยทั่วไป งาน cron มีลักษณะดังนี้:

* * * * * ทีม

เครื่องหมายดอกจันแต่ละอันในบรรทัดสอดคล้องกับค่าเฉพาะ:

0 และ 7 ในวันในสัปดาห์หมายถึงวันอาทิตย์ เนื่องจากในบางประเทศวันในสัปดาห์จะเริ่มต้นด้วยวันอาทิตย์ ดังนั้น 1 คือวันจันทร์ และ 6 คือวันเสาร์ นอกเหนือจากที่กล่าวข้างต้น อนุญาตให้ใช้อักขระพื้นฐานต่อไปนี้ในไฟล์ crontab:

# - ความคิดเห็น (บรรทัดที่ขึ้นต้นด้วยอักขระนี้จะไม่ถูกดำเนินการ)
, - การแจงนับค่า (1,2,3,4)
/ - ทุก ๆ n ครั้ง (*/n - ทุก ๆ n, */5 - ทุก ๆ 5, */2 - ทุก ๆ 2);
- - ช่วงของค่า (1-5 - ตั้งแต่ 1 ถึง 5, 4-6 - ตั้งแต่ 4 ถึง 6)

จากที่กล่าวมาข้างต้น รายการต่อไปนี้สอดคล้องกับบรรทัดต่อไปนี้:

0 5 * * * - ทุกวันเวลา 5:00 น.
*/10 * * * * - ทุก 10 นาที;
0 0 1 1 * - วันที่ 1 มกราคม ของทุกปี
0 9 * * 1,3,5 - วันจันทร์ วันพุธ และวันศุกร์ เวลา 9.00 น.
0 0 1 * * - ทุกวันที่ 1 ของเดือน

คุณยังสามารถเขียนค่าที่กำหนดไว้ล่วงหน้าต่อไปนี้ในไฟล์ crontab:

@reboot - เมื่อโหลดระบบปฏิบัติการ
@yearly - ทุกปี เวลาเที่ยงคืนของวันที่ 1 มกราคม
@รายเดือน - ทุกเดือน เวลาเที่ยงคืนของวันที่ 1
@weekly - ทุกวันจันทร์เวลาเที่ยงคืน
@daily - ทุกวัน เวลา 00:00 น.
@hourly - ทุกต้นชั่วโมง

ตัวอย่างไฟล์ crontab

วิธีที่ดีที่สุดในการทำความเข้าใจไวยากรณ์ของไฟล์ crontab คือการใช้ตัวอย่างต่อไปนี้: ผู้ใช้ crontab -e -u

#สวัสดี ฉันเป็นไฟล์ crontab ของผู้ใช้ และนี่คือสิ่งที่อาจารย์สอนฉัน
#ฉันทักทายเขาหลังจากดาวน์โหลด
@reboot echo "สวัสดีครับอาจารย์!"

#ทุกวันธรรมดา เวลา 6:45 ฉันจะรันสคริปต์ให้
#ซึ่งเปิดนาฬิกาปลุก
45 6 * * 1-5 /home/user/beep.sh

#ในขณะที่เจ้าของไปทำงานหรือนอนเพียงพอในวันหยุด
#ฉันส่งข่าวสารล่าสุดให้เขา (ทุกวัน เวลา 8.00 น.)
0 8 * * * /home/user/newsmail.sh

#ฉันโทรหาเจ้าของบ้านตอนเลิกงาน
0 18 * * 1-5 echo "กลับบ้านครับอาจารย์" | mail -s ผู้ใช้ "สิ้นสุดวันทำการ"

#และขอแสดงความยินดีกับเขาด้วย
@yearly สะท้อน "สวัสดีปีใหม่"