ครอนทุกเดือน Cron—รันโปรแกรมผู้ใช้ตามเวลาที่กำหนด การกำหนดค่าตัวกำหนดเวลางาน Cron อย่างถูกต้อง

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

วิธีตั้งค่า 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 ขั้นแรกให้ตรวจสอบด้วยคำสั่งต่อไปนี้ใน Unix Shell:

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

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

ข้อจำกัด

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

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

ใน Ubuntu Server จะใช้เป็นตัวกำหนดเวลางาน ครอน- ตัวกำหนดเวลาพร้อมอินเตอร์เฟสบรรทัดคำสั่ง เป็นส่วนสำคัญของระบบและเริ่มทำงานทันทีหลังการติดตั้ง โดยทำหน้าที่ต่างๆ ของระบบ เป้าหมายของเราคือการให้บริการของเรา โดยเฉพาะอย่างยิ่งเมื่อไม่ยากอย่างที่คิด

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

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

Crontab -e

เมื่อคุณเปิดใช้งานเป็นครั้งแรก ยูทิลิตีจะแจ้งให้คุณเลือกโปรแกรมแก้ไข เราขอแนะนำให้เลือก เอ็มซีดิต(ต้องติดตั้ง mc) หรือโปรแกรมแก้ไขอื่นที่คุณรู้วิธีการทำงาน

รูปแบบของกำหนดการคือ:

นาที ชั่วโมง วัน เดือน คำสั่ง day_of_week

  • นาที- เวลาเป็นนาทีตั้งแต่ 0 ถึง 59
  • ชั่วโมง- ตั้งแต่ 0 ถึง 23
  • วัน- วันของเดือนตั้งแต่ 1 ถึง 31
  • เดือน- ตั้งแต่ 1 ถึง 12 หรือการกำหนดตัวอักษรม.ค. - ธ.ค
  • วันในสัปดาห์- ตั้งแต่ 0 ถึง 6 (0 - วันอาทิตย์) หรือวันเสาร์ - อาทิตย์
  • ทีม- สตริงในรูปแบบของตัวแปลคำสั่งที่จะถูกดำเนินการ รายการเช่น ทีม1 && ทีม2เพื่อรันคำสั่งหลายคำสั่งติดต่อกัน

สามารถระบุค่านาที ชั่วโมง วัน ได้ดังนี้

  • ความหมาย- ตัวเลขระบุวันที่หรือเวลา อนุญาตให้ใช้ไวด์การ์ดได้ * ช่วยให้เกิดคุณค่าได้ครบถ้วน
  • ความหมายหลายประการ- อนุญาตให้ระบุหลายค่าโดยคั่นด้วยเครื่องหมายจุลภาค เช่น 2,14,22
  • ช่วงของค่า- ระบุด้วยยัติภังค์ เช่น 2-10
  • ขั้นตอนที่คุ้มค่า- ระบุเป็นเศษส่วน โดยมีตัวส่วนเป็นขั้นตอน เช่น */3 - ทุก ๆ ค่าที่สาม 0, 3, 6, 9 เป็นต้น ตัวเศษต้องเป็นช่วงของค่าหรือเครื่องหมายดอกจัน

พิจารณารายการตัวอย่างต่อไปนี้:

0 8-19/2 * * 1 /home/ivanov/test

หมายความว่าทุก ๆ ชั่วโมงที่สองตั้งแต่ 8 ถึง 19 (8, 10,12,14,16) ในวันจันทร์ ให้รันสคริปต์ทดสอบในโฮมไดเร็กตอรี่ของ Ivanov

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

* 10-15 * * * /home/ivanov/test

บรรทัดนี้จะรันสคริปต์ ทุกนาทีในช่วงตั้งแต่ 10 ถึง 15 ชั่วโมง มันจะถูกต้อง:

0 10-15 * * * /home/ivanov/test

รายการนี้จะทำให้สคริปต์ทำงานตอนเริ่มต้นของแต่ละชั่วโมงของช่วงที่ระบุ

นอกจากวันที่แล้ว คุณสามารถใช้สตริงพิเศษจำนวนหนึ่งได้:

  • @รีบูต- รันคำสั่งเมื่อรีบูต
  • @รายปีหรือ @เป็นประจำทุกปี- ดำเนินการในวันที่ 1 มกราคม คล้ายกับรายการ: " 0 0 1 1 * "
  • @รายเดือน- ดำเนินการทุกวันที่ 1 ของเดือน คล้ายกับ " 0 0 1 * * "
  • @รายสัปดาห์- ดำเนินการทุกวันอาทิตย์ เทียบเท่ากับ " 0 0 * * 0 "
  • @รายวันหรือ @เที่ยงคืน- ทุกวัน เวลาเที่ยงคืน" 0 0 * * * "
  • @รายชั่วโมง- ชั่วโมงละครั้ง " 0 * * * * "

ดังนั้นสำหรับการรันสคริปต์ของเราทุกวันทุกเที่ยงคืน คุณสามารถเขียน:

@เที่ยงคืน /home/ivanov/test

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

ไฟล์มีไว้สำหรับงานระบบและการดูแลระบบ /etc/crontabไวยากรณ์ของรายการในนั้นมีความโดดเด่นด้วยการมีค่าเพิ่มเติม - ผู้ใช้ที่จะเปิดตัวงานในนามของ:

นาที ชั่วโมง วัน เดือน day_of_week คำสั่งผู้ใช้

ตัวอย่างของรายการดังกล่าว:

0 19 * * 1-5 รูท /etc/backup

ตามที่เวลา 19.00 น. ตั้งแต่วันจันทร์ถึงวันศุกร์สคริปต์จะเปิดตัว /etc/backupในนามของผู้ใช้ ราก.

ไฟล์นี้ยังมีกำหนดเวลาของระบบด้วย ดังนั้นการแก้ไขจึงควรทำด้วยความระมัดระวัง ควรวางงานระบบและการบริหารทั้งหมดไว้ที่นั่น

อย่างที่เราเห็น ครอนมันค่อนข้างใช้งานง่าย แต่ในขณะเดียวกันก็ให้โอกาสมากมายในการตั้งค่าตารางเวลาในเซิร์ฟเวอร์ Ubuntu เราหวังว่าบทความนี้จะช่วยให้ผู้ดูแลระบบเชี่ยวชาญเครื่องมือนี้

ผู้ดูแลระบบและผู้ใช้ทั่วไปมักต้องทำการบำรุงรักษาและงานต่างๆ โดยอัตโนมัติด้วย 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 พิเศษและคำสั่งพิเศษ แน่นอน คุณสามารถแก้ไขไฟล์ /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"