Cronjob ทำงานทุกสองสัปดาห์ในวันเสาร์เริ่มในวันเสาร์นี้


11

วันนี้คือวันศุกร์, 3 ตุลาคม 2557 3:58 น

ฉันต้องการกำหนดเวลา cronjob แบบนั้นเพื่อให้ทำงานตามวันที่ต่อไปนี้:

  1. วันเสาร์ที่ 4 ตุลาคม 2557 8:00 น
  2. วันเสาร์ที่ 18 ตุลาคม 2557 8:00 น
  3. วันเสาร์ที่ 1 พฤศจิกายน 2014 8:00 น. ...

ดังนั้นทุก 2 สัปดาห์ในวันเสาร์เวลา 8 นาฬิกา

คำตอบ:


27
0 8 * * 6 test $((10#$(date +\%W)\%2)) -eq 1 && yourCommand

date +%W: จำนวนสัปดาห์ของปีกับวันจันทร์เป็นวันแรกของสัปดาห์ในวันนี้สัปดาห์ที่ 39

10#$(date +%W): แปลงdate +Wตัวเลขเป็นทศนิยมและหลีกเลี่ยงความสับสนในการแยกวิเคราะห์ฐานเชลล์

$((39%2)): การดำเนินการแบบโมดูโล: ผลลัพธ์คือ 0 (เลขคู่สัปดาห์) หรือ 1 (หมายเลขสัปดาห์คี่) ผลลัพธ์สัปดาห์นี้คือ 1 สัปดาห์หน้า 0

test 1 -eq 1: การทดสอบทางคณิตศาสตร์ (เท่ากับ) ในกรณีนี้ผลลัพธ์จะเป็นบูลีนจริง

&& yourCommand: บูลีน AND: รันyourCommandต่อเมื่อผลลัพธ์ของคำสั่งก่อนหน้านี้เป็นบูลีนจริง

โปรดทราบว่าปีจะได้รับสองสัปดาห์ที่แปลก: 53 (ปีนี้) และ 1 (ปีหน้า)


2
นั่นมันช่างงดงามจริงๆ! มันยังคงเป็นตามที่คุณสังเกตเห็นมีกรณีมุมในวันเสาร์ที่ 53 ของปีซึ่งจะเกิดขึ้นประมาณเจ็ดสิบปีในทุก ๆ สี่ศตวรรษ
MadHatter

@Cyrus ขอบคุณสำหรับคำตอบของคุณ แต่ถ้าฉันเขียน * * * * 5 ทดสอบ $ (($ (วันที่ +% W)% 2))) -eq 1 && /u02/restore/scripts/test.sh สคริปต์ไม่ได้ ทำงาน แต่ถ้าฉันเขียน * * * * 5 / u02/restore/scripts/test.sh สคริปต์ทำงาน ทำไมสีหน้าของคุณถึงไม่ทำงาน ฉันแค่ทดสอบเคสและพบว่าไม่ได้ผล
kupa

1
ความผิดพลาดของฉัน. Cron ตีความ% เป็นบรรทัดใหม่ หลบหนีทั้ง% ด้วย \ ใน cronjob ของคุณ:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus

ขออภัยที่จะนำกลับคำถามนี้เก่า แต่มันก็ไม่ทำงานสำหรับฉันและเมื่อฉันพยายามที่จะดำเนินเปลือกพยายามของฉันในการดำเนินการผลจากการคำนวณในสัปดาห์นี้:$((10#$(date +%W)%2)) -eq 1 && echo OK -bash: 1: command not foundเบาะแสใด ๆ ว่าทำไมถึงทำเช่นนั้น? ขอบคุณ
jhuet

3
@jhuet: testไม่มีคำสั่งita ของผู้ใช้ ลอง:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus

4

สิ่งที่คุณแสดงคือ "ทุกสัปดาห์" จากนั้นรหัสคือ:

0 8 * * 6

คุณแน่ใจหรือว่าต้องการใช้งานทุกสองสัปดาห์?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand

1
คุณช่วยอธิบายคำสั่งได้
มั้ย

1
จะดีกว่าที่จะใช้สิ่งที่ Cyrus ให้ - $ (($ (วันที่ +% W)% 2)) "W" หมายถึงหมายเลขสัปดาห์ในปี เริ่มต้นจากศูนย์ถึง 53 ถ้ามันสามารถหารด้วยสองได้นั่นคือสัปดาห์ "ทุก ๆ วินาที" ของคุณ ดังนั้น cronjob จะทำงานทุกสัปดาห์ แต่ 'expr' จะเรียกใช้งานคำสั่งของคุณเฉพาะเมื่อหมายเลขของสัปดาห์สามารถหารด้วย 2 ได้
Glueon

เมื่อฉันรันการทดสอบ $ (($ (วันที่ +% W)% 2)) -eq 1 บนบรรทัดคำสั่งจะไม่ส่งคืนอะไรเลยทำไม?
kupa

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