วิธีการกำหนดเวลา cronjob รายปักษ์?


11

crontab (5) กำหนดฟิลด์ต่อไปนี้:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

และอธิบาย:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

ดังนั้นไม่มีงานปักษ์ประจำสัปดาห์เท่าที่ความเข้าใจของฉันไป ฉันค่อนข้างแน่ใจว่ามีวิธีแก้ไขปัญหาคุณเป็นอะไร หรือฉันคิดถึงอะไรบางอย่าง?


2
คำตอบที่ดีที่สุดที่ฉันสามารถหาได้จากที่นี่: unix.stackexchange.com/questions/1224/…
Somantra

... และคำตอบเหล่านั้นบน U&L จะเป็นวิธีที่ฉันทำ @Somantra :-)
voretaq7

@ voretaq7 ฉันได้กล่าวว่ามันเป็นคำตอบที่ยอมรับได้ แต่ฉันไม่ต้องการเจอในฐานะคน
คล่องแคล่ว

คำตอบ:


8

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

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi

นี่เป็นวิธีแก้ปัญหาที่ดี แต่ไม่ได้ตอบคำถามจริงๆ - ฉันไม่ต้องการทำให้มัวหมองกับตารางเวลา บางทีฉันสามารถรวมสิ่งนี้กับลิงค์ที่ @Somantra
Roman

เอาล่ะฉันต้องยอมรับ: นี่เป็นทางออกที่ดีที่สุดจนถึงตอนนี้ ลิงก์ที่ @Somantra ให้ผลลัพธ์เดียวกัน IMHO ที่ซับซ้อนโดยไม่จำเป็น (นับด้วยเวลา UNIX) แต่การเพิ่มวิธีการของคุณโดยตรงกับ cronjob (แทนที่จะเป็นสคริปต์) ในสไตล์เดียวกันทำให้มันค่อนข้างหรูหรา
Roman

ช่วงนี้หยุดในปี 2020 เพราะมันมี 53 สัปดาห์ ตัวอย่าง: หาก cron ของคุณถูกกำหนดให้ทำงานรายปักษ์ในวันที่ 31 ธันวาคมมันจะทำงานในวันที่ 31 ธันวาคม 2020 (สัปดาห์ที่ 53) และวันที่ 4 มกราคม 2020 (สัปดาห์ที่ 1)
mad_fox

5

crons จำนวนมาก (คุณไม่ได้ระบุที่คุณใช้อยู่) รองรับช่วง ดังนั้นสิ่งที่ชอบ

0 0 1-7,15-21 * 3

จะตีวันพุธที่หนึ่งและสามของเดือน


นี่เป็นวิธีที่หรูหรากว่าวิธี "ทำในสคริปต์" เล็กน้อย แต่อย่าลืมเพิ่มความคิดเห็นใน crontab ของคุณ (กฎทั่วไปของหัวแม่มือ: ถ้าคุณมีมากกว่าหนึ่ง-หรือ/มีส่วนร่วมก็อาจคุ้มค่าการแสดงความคิดเห็นเพื่ออธิบายตาราง)
voretaq7

ฉันคิดว่ามันผิด มันจะทำให้งานทำงานในวันที่ 1-7 และ 15-21 ของแต่ละเดือนและทุกวันพุธเช่นกัน สิ่งนี้จากman 5 crontab: " วันของการดำเนินการของคำสั่งสามารถระบุได้โดยสองฟิลด์ - วันของเดือนและวันของสัปดาห์หากทั้งสองฟิลด์ถูก จำกัด (เช่นไม่ใช่ *) คำสั่งจะทำงานเมื่อทั้งสองฟิลด์ตรงกับ เวลาปัจจุบันตัวอย่างเช่น "30 4 1,15 * 5" จะทำให้คำสั่งทำงานเวลา 4:30 น. ในวันที่ 1 และ 15 ของแต่ละเดือนรวมถึงทุกวันศุกร์ "(ความสำคัญของฉัน)
MadHatter

1
ที่จริงแล้วขึ้นอยู่กับ cron daemon ที่คุณใช้ ผลงานของคุณดูเหมือนจะมาจาก vixie cron (รวมอยู่ใน RedHat distros) จาก "man crontab" บน cron ของ dillo (Slackware): หากคุณระบุทั้งวันในเดือนและวันในสัปดาห์ * มันจะถูกตีความว่าเป็นวันที่ Nth ในเดือน * แต่ถึงกระนั้นโซลูชันแบบสคริปต์ (คำนวณจำนวนสัปดาห์) ดูเหมือนว่าเป็นโซลูชันแบบพกพาเท่านั้น
AlvaroGMJ

2

สำหรับสิ่งที่ต้องวิ่งทุก ๆ สัปดาห์ให้ใช้สายการบินเดียว:

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

สคริปต์นี้ถูกกำหนดให้ทำงานในวันศุกร์ สัปดาห์ที่จะดำเนินการสามารถปรับได้โดยใช้ "-eq 0" หรือ "-eq 1"


1

Anacronเป็นวิธีแก้ปัญหาที่ดีสำหรับข้อ จำกัด ของ cron

  • Anacron มีพารามิเตอร์รอบการเกิดซ้ำซึ่งคุณสามารถตั้งค่าเป็น 14

คำสั่ง job-identifier ที่หน่วงเวลา

14 15 test.daily /path/to/script.sh


น่าเสียดายที่ Anacron ไม่สามารถใช้งานได้ ลืมพูดถึงว่า
Roman

1

หากความต้องการของคุณไม่ใช่แบบรายสัปดาห์คุณสามารถเรียกใช้ cronjob ได้ในวันที่ 1 และ 15 ของเดือน:

15 8 1,15 * * /your/script.sh

ซึ่งเริ่มเวลา 8:15 น. ในวันที่หนึ่งและสิบห้าของแต่ละเดือนโดยไม่คำนึงถึงวันในสัปดาห์


-2

จากคำอธิบายนั้นการตั้งค่า 3/2 ในฟิลด์สัปดาห์ควรเรียกใช้งานในทุกวันพุธ - โดยปริยาย แต่ฉันคิดว่าทำได้


ไม่นี่เทียบเท่ากับfor(int i=3; i <=3 ; i+=2) {} เมื่อผ่านไปเพียงครั้งเดียวเท่านั้นมันไม่สำคัญว่า "ขั้นตอน" คือ 1 หรือ 2
ตุ๋น

@stew พูดอะไร นอกจากนี้ยังไม่มี "เขตข้อมูลสัปดาห์"
Roman

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