ฉันจะทำให้ cron“ สุ่ม” ได้ไหม?


12

บางทีฉันอาจจะบ้าอย่างสมบูรณ์และถ้าเป็นเช่นนั้น - ก็ไม่เป็นไร แต่ฉันจะกำหนดเวลางานให้ส่งข้อความงี่เง่าตามกำหนดการได้fortuneอย่างไร

ชี้แจง
ใช่ - นี่คือเวิร์กสเตชันส่วนตัวของฉัน - ไม่ได้วางแผนที่จะทำสิ่งที่สกปรกบนเซิร์ฟเวอร์ที่ใช้งานจริง :)

คำตอบ:


12

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

ตัวอย่างเช่น (ตรวจสอบไวยากรณ์ที่ถูกต้องโดยใช้man atหรือinfo at)

at -f ไฟล์ now + 53 minutes

หรือ

at -f ไฟล์ now + 2 hours

จะเรียกใช้คำสั่งในไฟล์ที่ระบุใน 53 นาทีหรือ 2 ชั่วโมงตามลำดับ

at จากนั้นสามารถเรียกใช้อีกครั้งเมื่อเริ่มต้นของงานที่กำหนดเวลาด้วยการเริ่มต้นนับและหน่วยเวลาที่เหมาะสม

แก้ไข

ในขณะที่ Arjan ชี้ให้เห็นอย่างเป็นประโยชน์ด้านล่างหากคุณกำลังใช้สิ่งนี้กับสิ่งอื่นนอกเหนือจากแอปพลิเคชันของเล่นคุณต้องคิดถึงปัญหาต่าง ๆ เช่นสิ่งที่เกิดขึ้น

  1. หากการเรียกใช้ครั้งถัดไปเริ่มต้นก่อนที่รายการก่อนหน้าจะเสร็จสิ้น

  2. หากการเรียกใช้ล้มเหลวในการดำเนินการอย่างถูกต้องหรือ

  3. หากการเรียกใช้ครั้งต่อไปไม่สามารถเริ่มต้นได้เลยหรือตรงเวลา (เช่นจะเกิดอะไรขึ้นหากเครื่องหยุดทำงานเมื่อการทำงานครั้งต่อไปเริ่มต้น)

  4. เกี่ยวกับการบันทึกและรายงานการทำงานล้มเหลวหรือสำเร็จ


นั่นเป็นวิธีที่ฉันไม่ได้พิจารณา - และสามารถทำซ้ำได้หากfileมีการatเรียกใช้ครั้งต่อไปถูกต้องหรือไม่
warren

ดี - เพียงแค่พยายามออกและใช้งานได้ดี :)
วอร์เรน

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

@Arjan - ฉันไม่กังวลเกินไปเกี่ยวกับมันล้มเหลวและไม่ส่งอีเมลถึงฉัน .. ตั้งแต่ (ณ จุดนี้) ฉันแค่ใช้มันเพื่อความสนุกบนเวิร์กสเตชันของฉัน :) .. ไม่ว่า - นั่นคือสิ่งที่คิด หากสิ่งนี้ได้ขยายไปพูดการตรวจสอบแบบสุ่มสำหรับการบุกรุก
วอร์เรน

สคริปต์ที่ฉันวาดภาพจะไม่ดูแลสำเนาหลายวิธีที่ตัวเองกำลังทำงานในครั้งเดียว
วอร์เรน

13

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

ตัวอย่างนี้รับและวิเคราะห์เว็บเพจระหว่าง 10 ถึง 50 วินาทีก่อนทุก 5 นาที:

4-59/5 * * * * root (sleep $(($RANDOM\%40+10))) && /etc/munin/plugins/someplugin prefetch

ไม่จำเป็นต้องมีเวลาที่แน่นอนเนื่องจากข้อมูลมีการเคลื่อนไหวช้า แต่จะช่วยให้เวลาในการประมวลผลของ munin-node ต่ำที่สุดเท่าที่จะเป็นไปได้โดยไม่ต้องรอหน้าเว็บ (ปลั๊กอินจะแคชหน้าต่อไปเป็นเวลา 30 นาทีเพื่อลดการเข้าชมที่ไม่จำเป็น แต่ต้องอัปเดตฐานข้อมูลทุก 5 นาที)

หมายเหตุ \% - cron ใช้แทน% สำหรับ "\ n" - มีประโยชน์สำหรับเก็บข้อความอีเมลไว้ในหนึ่งบรรทัด


ถ้าคุณกำลังแคชหน้าเว็บที่คุณไม่จำเป็นต้องไปที่จะได้รับผลที่ถูกต้องโหลด
วอร์เรน

1
ใช่ฉันรู้ - 'ข้อมูลเคลื่อนไหวช้า' - ปลั๊กอินรับอัตราแลกเปลี่ยนสกุลเงินจากเว็บไซต์หนึ่งและฉันไม่ต้องการถูกห้าม (ฉันไม่ใช่พ่อค้า แต่ฉันใช้เวลามากมายในการดูกราฟ munin) ฉันทำปลั๊กอินที่คล้ายกันสำหรับสภาพอากาศในท้องถิ่น แอพพลิเคชั่นไม่มีที่สิ้นสุด!
Andy Lee Robinson

1
AHA! .. วิธีการที่เจ๋งมาก :)
warren

6

ภายในถึงcronฉันไม่คิดว่าคุณสมบัติดังกล่าวมีอยู่ ฉันคิดว่าทางออกที่ดีที่สุดคือการวางคำสั่งของคุณลงในเชลล์สคริปต์และวางsleepช่วงเวลาแบบสุ่มที่ด้านบนสุดของสคริปต์และใช้$RANDOMตัวแปร จากนั้นเรียกใช้สคริปต์วันละครั้งในงาน cron ปกติ

#!/bin/bash
sleep $(($RANDOM%5))
/path/to/command -param1 -param2

1
sleep () เป็นการรับประกันเกือบว่าผู้ให้บริการจะถูกฆ่า นอกเสียจากว่าเขาจะเป็นผู้ให้บริการ
คนแคระ

1
ฉันคิดว่ามันเป็นเครื่องลินุกซ์ของเขาเองหรือบางสิ่งบางอย่างถ้าเขานำเสนอโชคลาภโดยการสุ่มให้กับใครบางคน
John John

นั่นเป็นเรื่องจริง
คนแคระ

ทำไมการนอนหลับจึงเป็นความคิดที่ไม่ดี? แค่ถาม ...
Tadeusz A. Kadłubowski

ชี้แจงคำถามสำหรับ @John T
warren

6

มันจะขึ้นอยู่กับประเภทของช่วงเวลาที่คุณอยู่หลัง แต่ให้เราสมมติว่าคุณต้องการให้สคริปต์ทำงานแบบสุ่มโดยมีความน่าจะเป็น 1:30 (ทุกๆ 30 นาที)

  • สร้างสคริปต์ cron ของคุณด้วยความเร็วประมาณ 10 นาที มันจะยิง 3 ครั้งทุก ๆ 30 นาที

  • ภายในสคริปต์ใช้randเป็นเงื่อนไขสำหรับคำสั่งif คุณต้องการให้ rand ส่งคืนตัวเลขระหว่าง 0 ถึง 2 หากเป็น 0 ให้ดำเนินการเนื้อหาของคำสั่ง if

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


@A แคระ - ขอบคุณสำหรับความคิดนี้ด้วย - นี้จะเป็นเส้นทางเล็กน้อยที่มีประโยชน์มากขึ้นถ้าผมต้องการที่จะตรวจสอบการบุกรุก ฯลฯ ในบางพื้นฐานบ่อย แต่กึ่งสุ่ม
วอร์เรน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.