คำสั่งครอน การตั้งค่าตัวกำหนดเวลางาน - Crontab

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

วิธีการตั้งค่า cron ในบัญชีส่วนตัวของคุณ (สำหรับภาษียูนิกซ์)

เนื่องจากโปรแกรม PHP บางโปรแกรมไม่สามารถทำงานผ่าน SAPI CLI ได้โดยไม่ต้องแก้ไขล่วงหน้า คุณจึงสามารถรันโปรแกรมเหล่านั้นได้ ตกลง- ตัวอย่างเช่น:

/usr/local/bin/wget -O /dev/null -q http://mysite.tld/cron.php?action=123

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

วิธีรับข้อความแสดงข้อผิดพลาดจากโปรแกรมที่รันโดย cron

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

[email protected]

แน่นอน, ที่อยู่@domain.ruคุณต้องแทนที่ด้วยที่อยู่อีเมลจริงที่จะใช้ส่งการแจ้งเตือน หากคุณต้องการได้รับข้อความแสดงข้อผิดพลาดไปยังที่อยู่หลายแห่ง ให้ระบุที่อยู่เหล่านี้ทั้งหมดโดยคั่นด้วยเครื่องหมายจุลภาค

โปรดทราบว่า cron จะส่งเอาต์พุตสคริปต์ที่ทำงานอยู่ทางไปรษณีย์ ตัวอย่างเช่น หากคุณเขียนสคริปต์ที่พิมพ์บรรทัด “Hello, world” และเรียกใช้ผ่าน cron คุณจะได้รับอีเมลพร้อมบรรทัด “Hello, world” ทุกครั้งที่ cron เรียกใช้สคริปต์ดังกล่าว

เพื่อหลีกเลี่ยงปัญหานี้ ตัวอย่างเช่น เมื่อคุณไม่ต้องการเอาต์พุตข้อความจากสคริปต์ คุณจะต้องเพิ่มอักขระ

> /dev/null 2>&1

บรรทัดที่สมบูรณ์สำหรับ cron จะมีลักษณะดังนี้:

0 1 * * * /usr/local/bin/php -q $HOME/script.php > /dev/null 2>&1

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

/usr/local/bin/php -l script.php

หากไม่มีข้อผิดพลาดในสคริปต์ คุณจะเห็นข้อความ “ไม่พบข้อผิดพลาดทางไวยากรณ์ใน script.php”

ข้อจำกัด

สำหรับโปรแกรมที่เรียกใช้ผ่าน 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 คุณสามารถติดตั้งได้ด้วยคำสั่ง

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

ครอนคืออะไร?

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

ไฟล์ crontab

องค์ประกอบที่สำคัญที่สุดในการตั้งค่า Cron คือไฟล์กำหนดค่า crontab ประกอบด้วยคำสั่งดำเนินการและเส้นทางไปยังสคริปต์ พวกเขาทั้งหมดทำงานเป็น superuser เนื่องจากไฟล์เหล่านี้อยู่ในไดเร็กทอรี /etc/cron.d จึงควรกำหนดค่าไฟล์เหล่านี้ที่นั่น

สำหรับทุกคน ผู้ใช้แต่ละรายระบบใช้ไฟล์ crontab ของตัวเอง

Linux รุ่นต่างๆ จะใช้ไดเร็กทอรีที่แตกต่างกันในการจัดเก็บ การตั้งค่าแบบกำหนดเอง- สำหรับ RedHat นี่คือ var / สปูล/ครอน บน Debian และ Ubuntu นี่จะเป็น var/spool/cron/crontabs และ var/spool/cron/tabs ใน SUSE

รายการคำสั่งสำหรับจัดการ crontab

Cron มีชุดคำสั่งพิเศษที่สามารถใช้เพื่อควบคุมตัวกำหนดตารางเวลา จำเป็นต้องใช้ร่วมกับ crontab นี่เป็นรายการเล็กๆ น้อยๆ:

  • -คุณชื่อผู้ใช้ ตั้งค่าผู้ใช้ที่จะประมวลผลงานและการตั้งค่า การดำเนินการเพิ่มเติม- หากคุณละเว้น ได้รับกุญแจผู้ใช้เริ่มต้นจะถูกตั้งค่า
  • -ล. แสดงรายการงานปัจจุบัน
  • -e เปิดตัวแก้ไขสำหรับตัวกำหนดเวลางาน
  • -ร. ลบงานที่มีอยู่ทั้งหมดออกจากรายการ

รูปแบบงาน

ดังที่ได้กล่าวไปแล้ว การตั้งค่า Cron ประกอบด้วยการระบุคำสั่งต่างๆ เข้าไป ไฟล์พิเศษ- ดูเหมือนว่า รายการง่ายๆประกอบด้วยหกคอลัมน์:

  • อันแรกระบุจำนวนนาที ช่วงที่ใช้ได้คือตั้งแต่ 0 ถึง 59 คุณสามารถใช้ค่า ช่วง และได้หลายค่า อักขระพิเศษ;
  • คอลัมน์ที่สอง - ชั่วโมง สามารถใช้ค่าตั้งแต่ 0 ถึง 23
  • วันถัดไป ที่นี่คุณสามารถระบุตัวเลขตั้งแต่ 1 ถึง 31
  • ที่สี่คือเดือน ค่าต่ำสุด 1, สูงสุด - 12;
  • ห้า - สัปดาห์ 0 หรือ 7 ตรงกับวันอาทิตย์
  • คำสั่งสุดท้ายคือคำสั่งนั้นเอง

ตามที่กล่าวไว้ คุณสามารถระบุอักขระพิเศษ "*" หรือ "/" ในไฟล์ได้ ตัวอย่างเช่น รายการดังกล่าวคือ 23 */2 *** echo “Run” หมายความว่าทุก ๆ ชั่วโมงและ 23 นาทีคำจารึก “Run” จะปรากฏขึ้น

คุณสมบัติของไฟล์ crontab

เมื่อตั้งค่า Cron คุณต้องจำไว้ว่ามีคุณสมบัติเฉพาะที่ควรคำนึงถึงเมื่อกำหนดค่า:

  • ทุกไฟล์จะต้องสิ้นสุด บรรทัดว่าง, มิฉะนั้น จุดสุดท้ายอาจถูกละเลยและบางครั้งไฟล์ทั้งหมด
  • ไฟล์ที่อยู่ในไดเร็กทอรีที่มีจุดอยู่ในชื่อจะถูกละเว้นโดยตัวกำหนดตารางเวลาเช่นกัน
  • คุณสามารถใช้สัญลักษณ์ปอนด์ “#” ในไฟล์กำหนดค่าได้ ใช้เพื่อทำเครื่องหมายบรรทัดพร้อมความคิดเห็น สิ่งนี้มีประโยชน์มากสำหรับการอธิบายงานและคำสั่งที่กำหนดเวลาไว้

ตัวแปรเพิ่มเติม

เมื่อตั้งค่า Cron คุณสามารถใช้ค่าพิเศษและตัวย่อในคำสั่งได้ ตัวอย่างเช่น คุณสามารถใช้รายการต่อไปนี้เพื่อระบุวันในสัปดาห์:

  • อาทิตย์ - วันอาทิตย์;
  • จันทร์ - จันทร์;
  • อังคาร - อังคาร;
  • พุธ - สิ่งแวดล้อม;
  • พฤ - พฤหัสบดี;
  • ศุกร์ - ศุกร์;
  • วันเสาร์-วันเสาร์

นอกจากนี้ยังมีค่าตัวอักษรแยกต่างหากสำหรับเดือน - ม.ค. ก.พ. มี.ค. เม.ย. พ.ค. มิ.ย. ก.ค. ส.ค. ก.ย. ต.ค. พ.ย. ธ.ค.

นอกจากนี้ยังมีตัวแปรแยกต่างหากสำหรับการกำหนดค่า Cron ที่สามารถแทนที่บรรทัดคำสั่งทั้งหมดได้:

  • @รีบูต คำสั่งจะทำงานทุกครั้งที่คุณเริ่มคอมพิวเตอร์
  • @รายปี. งานนี้จะเปิดตัวปีละครั้ง สัญกรณ์ที่เทียบเท่าในรูปแบบตัวเลขอาจเป็น: 0 0 1 1 * คำพ้องความหมายสามารถเขียนเป็น @annually;
  • @รายเดือน. ตามที่คุณสามารถเดาได้จากชื่อ ตัวแปรนี้จะรันคำสั่งเดือนละครั้ง อะนาล็อกตัวเลขของมันคือ 0 0 1 * *;
  • @รายสัปดาห์. ตัวแปรนี้จะทำงานทุกสัปดาห์
  • @รายวัน. วันละครั้ง;
  • @เที่ยงคืน. การเปิดตัวจะมีขึ้นในเวลาเที่ยงคืน
  • @รายชั่วโมง. ทุกชั่วโมง.

การตั้งค่า Cron บน Centos 7

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

ตัวอย่างที่เป็นประโยชน์สำหรับการสร้างงานที่ทำซ้ำบ่อยๆ

Cron สามารถกำหนดค่าให้ครอบคลุมเกือบทุกความต้องการของผู้ใช้

  • 00 09-17 * * 1 - 5 /path/ ถึงทีม/ มงกุฏ. คำสั่งนี้จะดำเนินการตามกำหนดเวลาโดยอัตโนมัติทุกวันทำการตั้งแต่ 9 ถึง 5 ทุกนาทีแรก
  • 00 9.17 * * * /path/ ถึงทีม/ มงกุฏ ในตัวอย่างนี้ คำสั่งจะถูกดำเนินการวันละสองครั้ง ตัวแรกเวลา 9.00 น. ครั้งที่สองเวลา 5.00 น. เครื่องหมาย "*" ระบุว่าคำสั่งจะดำเนินการทุกวัน เดือน และปี
  • อย่าลืมเกี่ยวกับตัวแปรเชิงสัญลักษณ์ด้วย ตัวอย่างเช่น @monthly จะรันงานทุกเดือนในนาทีแรกของชั่วโมงแรกของวันแรก และ @daily จะเปิดตัวทุกวัน

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

มันเป็นงานเหล่านี้ที่ Linux ใช้ บริการระบบครอน นี่คือตัวกำหนดตารางเวลาที่ช่วยให้คุณสามารถรันสคริปต์ที่คุณต้องการได้ชั่วโมงละครั้ง วันละครั้ง สัปดาห์หรือเดือน ตลอดจนเวลาใดก็ได้ที่คุณระบุหรือตามช่วงเวลาใดก็ได้ โปรแกรมนี้มักจะถูกใช้โดยบริการอื่น ๆ ระบบปฏิบัติการ- ในบทความนี้เราจะดูวิธีกำหนดค่า 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 การวางแผนที่สะดวกงานอัตโนมัติ ฉันหวังว่าข้อมูลนี้จะเป็นประโยชน์กับคุณ

ในระบบ ลินุกซ์การเริ่มต้นงานอัตโนมัติดำเนินการโดย crond daemon และการกำหนดเวลา เริ่มต้นอัตโนมัติไม่เพียงแต่ผู้ดูแลระบบเท่านั้น แต่ผู้ใช้สามารถทำงานต่างๆ ได้อีกด้วย

ครอนด์ทำงานอย่างไร?

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

การจัดกำหนดการงาน

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

รูปแบบไฟล์ Crontab

ส่วนวันที่และเวลาประกอบด้วยช่องตัวเลขห้าช่อง คั่นด้วยช่องว่าง ซึ่งกำหนดเวลาที่งานเริ่มต้น:

เพื่อความสะดวกในการกรอกข้อมูลในฟิลด์เหล่านี้ จึงมีการนำกฎต่อไปนี้:

  • คุณสามารถระบุค่าเป็นช่วงตัวเลขได้ ตัวอย่างเช่น ช่วงเวลา 1-3 ในช่องชั่วโมงหมายถึง 1.00, 2.00 และ 3.00 น. เที่ยงคืน 2-4 ในช่องวันในสัปดาห์ - วันอังคาร วันพุธ หรือวันพฤหัสบดี
  • ช่วงเวลาสามารถตั้งค่าเพิ่มได้มากกว่าหนึ่ง ตัวอย่างเช่น หากต้องการระบุทุกชั่วโมงที่สองเริ่มตั้งแต่เที่ยงคืน คุณจะต้องตั้งค่าช่วงเวลาเป็น 0-23 โดยเพิ่มทีละ 2 โดยคั่นด้วยเครื่องหมายทับ: 0-23/2
  • เครื่องหมายดอกจัน (*) ระบุช่วงค่าฟิลด์ทั้งหมดตั้งแต่ต่ำสุดไปจนถึงสูงสุด ตัวอย่างเช่น ในช่องวันของเดือน เครื่องหมายดอกจันหมายถึงช่วง 0-31 ในช่องวันของสัปดาห์ - 0-7
  • สามารถระบุวันในสัปดาห์หรือเดือนด้วยตัวอักษรสามตัวแรกของชื่อ (ภาษาอังกฤษ)

ตัวอย่างวันที่และเวลา

ตัวอย่างการกรอกข้อมูลในช่องวันที่และเวลา:

0 1 * * * รันงานทุกวัน เวลา 1.00 น. เที่ยงคืน 30 14 * * 0 รันงานทุกวันอาทิตย์ เวลา 14.30 น. 0 23-7/2.8 * * * รันงานทุก 2 ชั่วโมง ตั้งแต่ 23.00 ถึง 7.00 น. และ 8.00 0 12 * 1 จันทร์ รันงานตอนเที่ยงของทุกวันจันทร์ของเดือนมกราคมของทุกปี 0 12 2 กุมภาพันธ์ * รันงานตอนเที่ยงของวันที่สองของเดือนกุมภาพันธ์ของทุกปี

ช่องคำสั่ง

ฟิลด์คำสั่งถูกแยกออกจากฟิลด์วันที่-เวลาด้วยช่องว่างอย่างน้อยหนึ่งช่อง และขยายไปจนถึงท้ายบรรทัด คำสั่งถูกประมวลผลโดยเชลล์ /bin/sh

ตัวอย่างเช่น, รายการถัดไปในไฟล์ crontab ระบุว่าโปรแกรม /usr/sbin/backup จะเปิดตัวทุกวันเวลา 1.00 น.:

0 1 * * * /usr/sbin/backup

คำสั่งบางคำสั่ง (เช่น เมล) จำเป็นต้องมีอินพุตจากอุปกรณ์ อินพุตมาตรฐาน- ซึ่งระบุโดยใช้เครื่องหมายเปอร์เซ็นต์ (%) อักขระตัวแรกระบุถึงจุดเริ่มต้นของอินพุตมาตรฐาน อักขระแต่ละตัวที่ตามมาจะระบุถึงการเปลี่ยนแปลงบรรทัด

การแก้ไขไฟล์ crontab

ไฟล์ crontab ได้รับการแก้ไขด้วยคำสั่ง crontab -e เป็นไปได้สองแนวทาง:

  • สร้างไฟล์ใหม่พร้อมรายการทั้งหมดที่ควรรวมอยู่ในไฟล์ crontab จากนั้นเขียนลงดิสก์ภายใต้ชื่อนี้โดยใช้คำสั่ง crontab
  • แก้ไขไฟล์โดยตรงโดยใช้คำสั่ง crontab -e

เขียนจากไฟล์

หากต้องการเขียนเนื้อหาของไฟล์ crontab จากไฟล์อื่น คุณจะต้องสร้างไฟล์อื่นนั้น (ตามปกติ โปรแกรมแก้ไขข้อความ) พร้อมด้วยรายการทั้งหมดที่ควรประกอบเป็นไฟล์ crontab นี่อาจเป็นรายการต่อไปนี้:

0 1 * * * /usr/sbin/backup

ควรกำหนดไฟล์ที่สร้างขึ้น ชื่อที่เหมาะสมเช่นงานсron หลังจาก ไฟล์ที่ระบุสร้างขึ้นเนื้อหาจะต้องเขียนลงในไฟล์ crontab ด้วยคำสั่ง:

~$ crontab cronjobs

เนื้อหาของไฟล์ cronjobs จะแทนที่เนื้อหาของไฟล์ crontab โดยสมบูรณ์ ผู้ใช้ที่กำหนด- เมื่อใช้วิธีนี้ ผู้ใช้ทุกคนจะสามารถแก้ไขไฟล์ crontab ได้ ผู้ใช้ระดับสูงมีสิทธิ์พิเศษในการแก้ไขไฟล์ crontab ของผู้ใช้รายอื่น การแก้ไขไฟล์ของผู้อื่นจะถูกระบุโดยแฟล็ก -u ตัวอย่างเช่น โดยคำสั่ง:

~# crontab -u oleg cronjobs

ไฟล์ cronjobs ถูกเขียนเป็นไฟล์ crontab ของผู้ใช้ oleg

แก้ไขไฟล์ crontab โดยตรง

คำสั่ง crontab หลีกเลี่ยงการดำเนินการหลายขั้นตอนในการสร้าง แยกไฟล์- หากคุณออกคำสั่ง crontab ด้วยตัวเลือก -e คุณสามารถแก้ไขไฟล์ crontab ได้โดยตรง

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

~$ ส่งออก EDITOR=xedit

หลังจากนั้นให้ป้อนคำสั่ง

ทำให้ไฟล์ crontab ถูกเปิดในตัวแก้ไขที่ระบุ

เช่นเดียวกับ ผู้ใช้ปกติสามารถแก้ไขได้ ไฟล์ของตัวเอง crontab ผู้ใช้ขั้นสูงสามารถแก้ไขไฟล์ crontab ของผู้ใช้รายอื่นได้ เมื่อต้องการทำเช่นนี้ ให้ใช้คำสั่ง:

~# crontab -u ชื่อผู้ใช้ -e

การดูไฟล์ crontab

หากต้องการดูเนื้อหาของไฟล์ crontab ให้ป้อนคำสั่ง:

ผู้ใช้ระดับสูงสามารถดูไฟล์ crontab ของผู้ใช้รายอื่นได้:

~# crontab -u ชื่อผู้ใช้ -l

การลบไฟล์ crontab

หากต้องการลบเนื้อหาของไฟล์ crontab ผู้ใช้ป้อนคำสั่ง:

ผู้ใช้ขั้นสูงสามารถลบไฟล์ crontab ของผู้ใช้รายอื่นได้