เรียกใช้สคริปต์ผ่าน cron ทุกสัปดาห์


12

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

ตอนนี้ฉันกำลังโน้มตัวไปยังการสร้างสคริปต์ที่จะทำงานทุกสัปดาห์และจะแตะไฟล์ "ตั้งค่าสถานะ" เมื่อมันทำงานและหากมันทำงานและมีไฟล์อยู่แล้วเพื่อลบไฟล์ (และไม่ทำการ การกระทำรายปักษ์)

คำถามของฉันคือมีวิธีอื่นที่สวยงามหรือเรียบง่ายกว่านี้ในการบรรลุเป้าหมายของการทุบตีสคริปต์ของการกระทำที่ทำงานทุกสัปดาห์โดยอัตโนมัติหรือไม่?

ขอบคุณ!


1
คุณสามารถใช้หมายเลขสัปดาห์ ISO แทนไฟล์แฟล็ก (เช่น% V ของ strftime)

@Roger: ฉันคิดว่าคุณหมายถึงเงื่อนไขในสคริปต์
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

@Dennis: ไม่จำเป็นต้อง (เช่นดูว่าคำตอบของฉันตรวจสอบนอกสคริปต์) แต่ประเด็นหลักของฉันคือมันจะง่ายกว่ามากและไม่จำเป็นต้องมีสถานะในระบบไฟล์ อย่างไรก็ตามฉันรู้ว่ามันมีข้อเสียเปรียบที่คล้ายกันคือการตรวจสอบวันของเดือน: บางปีมี 53 สัปดาห์และบางคนมี 52

คำตอบ:


11
0 0 * * Thu bash -c '(($(date +\%s) / 86400 \% 14))' && your-script

ฉันใช้ bash ทำคณิตศาสตร์เพราะฉันขี้เกียจ สลับไปที่สิ่งที่คุณต้องการ ฉันใช้ประโยชน์จากวันที่ 1 มกราคม 1970 เป็นวันพฤหัสบดี สำหรับวันอื่น ๆ ของสัปดาห์คุณต้องสมัครออฟเซ็ต Cron ต้องการสัญญาณเปอร์เซ็นต์ที่หนีไป

ตรวจสอบอย่างรวดเร็ว:

function check {
  when=$(date --date="$1 $(($RANDOM % 24)):$(($RANDOM % 60))" --utc)
  echo -n "$when: "
  (($(date +%s --date="$when") / 86400 % 14)) && echo run || echo skip
}

for start in "2010-12-02" "2011-12-01"; do
  for x in $(seq 0 12); do
    check "$start + $(($x * 7)) days"
  done
  echo
done

หมายเหตุฉันได้เลือกเวลาสุ่มเพื่อแสดงว่าสิ่งนี้จะทำงานได้ถ้าทำงานได้ทุกเวลาในวันพฤหัสบดีและวันที่ที่เลือกซึ่งมีขอบเขตข้ามปีรวมถึงเดือนที่มีทั้ง 4 และ 5 วันพฤหัสบดี

เอาท์พุท:

Thu Dec  2 06:19:00 UTC 2010: run
Thu Dec  9 23:04:00 UTC 2010: skip
Thu Dec 16 05:37:00 UTC 2010: run
Thu Dec 23 12:49:00 UTC 2010: skip
Thu Dec 30 03:59:00 UTC 2010: run
Thu Jan  6 11:29:00 UTC 2011: skip
Thu Jan 13 13:23:00 UTC 2011: run
Thu Jan 20 20:33:00 UTC 2011: skip
Thu Jan 27 16:48:00 UTC 2011: run
Thu Feb  3 17:43:00 UTC 2011: skip
Thu Feb 10 05:49:00 UTC 2011: run
Thu Feb 17 08:46:00 UTC 2011: skip
Thu Feb 24 06:50:00 UTC 2011: run

Thu Dec  1 21:40:00 UTC 2011: run
Thu Dec  8 23:24:00 UTC 2011: skip
Thu Dec 15 22:27:00 UTC 2011: run
Thu Dec 22 02:47:00 UTC 2011: skip
Thu Dec 29 12:44:00 UTC 2011: run
Thu Jan  5 17:59:00 UTC 2012: skip
Thu Jan 12 18:31:00 UTC 2012: run
Thu Jan 19 04:51:00 UTC 2012: skip
Thu Jan 26 08:02:00 UTC 2012: run
Thu Feb  2 17:37:00 UTC 2012: skip
Thu Feb  9 14:08:00 UTC 2012: run
Thu Feb 16 18:50:00 UTC 2012: skip
Thu Feb 23 15:52:00 UTC 2012: run

2
วินาทีนับตั้งแต่ยุคอยู่ใน UTC โดยทั่วไปในขณะที่ cron ทำงานในเวลาท้องถิ่น หากเขตเวลาระบบของคุณไม่ใช่ UTC สิ่งนี้จะนำไปสู่ความสับสน ("ทำไมมันไม่ทำงานเหรอมันเป็นวันศุกร์ใน UTC แล้ว") การดำรงอยู่ของเวลาตามฤดูกาลทำให้การทำงานรอบนี้ยากมาก ( แต่ไม่เป็นไปไม่ได้นับตั้งแต่วันที่แคลบอกคุณ UTC ปัจจุบัน offset)
derobert

5

วิธีหนึ่งอาจใช้atยูทิลิตี้นี้หากคุณใช้งาน Linux คุณสามารถวางสิ่งนี้ไว้ท้ายบทของคุณ:

at X + 2 weeks -f myscript

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


หากนี่จะเป็นทางออกระยะยาวฉันไม่แนะนำให้เรียกใช้สิ่งนี้แม้ว่าฉันจะสร้างฟังก์ชั่นในสคริปต์ซึ่งจะทราบว่ามันจำเป็นต้องใช้หรือไม่
Paul

3

หากคุณสามารถใช้anacronกับระบบสิ่งต่าง ๆ จะง่ายขึ้นมาก หากต้องการใช้งานanacronคุณจะต้องติดตั้งและคุณต้องมีสิทธิ์การเข้าถึงรูท มันไม่ทำงานบนระบบเก่า (เช่น RHEL 5.x), รุ่นเก่าของรุ่นเก่าเท่านั้นที่ทำงานเมื่อบูทขึ้น มันจะทำงานกับระบบใหม่ (เช่น RHEL 6.x)

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

ในการรันสคริปต์ทุกสัปดาห์คุณต้องเพิ่มบรรทัดที่คล้ายกับการติดตาม / etc / anacrontab:

14 5 myScript script.sh

ลองดูที่หน้า man สำหรับรายละเอียด


การใช้งานanacronนั้นชัดเจนว่าเป็นวิธีแก้ปัญหา IMO ที่สะอาดที่สุด (เว้นแต่จะมีผลกระทบที่ไม่พึงประสงค์สำหรับบางคน)
JanC

0

ฉันไม่แน่ใจว่ามีวิธีที่สง่างามกว่านี้ในการกำหนดทุก ๆ สัปดาห์ แต่สิ่งนี้อาจได้ผลสำหรับคุณ

00 06 1-7,15-21 * * test `date +\%a` = Thu && /path/to/script

วิธีนี้จะเปิดตัวสคริปต์เวลา 6:00 น. ของวันพฤหัสบดีที่หนึ่งและสามของเดือน


2
แต่นั่นก็จะจบลงด้วยการกระโดดข้ามสัปดาห์ถ้ามีเดือนที่มี 3 วันพฤหัสบดี
David Z

1
มีเดือนที่มีเพียง 3 วันพฤหัสบดีไหม แม้ว่าฉันสามารถเห็นมันข้ามสัปดาห์ถ้ามี 5 วันพฤหัสบดี มันสามารถอัปเดตเป็นได้1-7,15-21,29-31แต่หลังจากนั้นมันจะย้อนกลับไปด้านหลังถ้ามีแมตช์ใด ๆ สำหรับเซ็ตสุดท้าย ...
pferate

1
ภายใน 3 วันพฤหัสบดีคุณหมายถึง 3 วันพฤหัสบดีที่สคริปต์จะทำงานและไม่รวม 3 วันพฤหัสบดี? ฉันอาจอ่านผิดครั้งแรก
pferate

0

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

สิ่งนี้จะต้องใช้ความคิดเพิ่มเติมในการทำงานตั้งแต่เดือนธันวาคมถึงเดือนมกราคม

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

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