31 บ่งบอกถึงการสิ้นเดือนในงาน cron หรือไม่?


12

สำหรับงาน cron เรารู้ว่าเราสามารถกำหนดเวลาได้ดังนี้

# +------------ Minute (0 - 59)
# | +---------- Hour (0 - 23)
# | | +-------- Day of the Month (1 - 31)
# | | | +------ Month (1 - 12)
# | | | | +---- Day of the Week (0 - 7) (Sunday is 0 or 7)
# | | | | |
# * * * * * command

สิ่งที่ฉันอยากรู้คือเมื่อเรากำหนดวันที่ 31 เดือนหมายความว่าสิ้นเดือนแต่ละเดือนแม้ว่าเดือนนั้นจะไม่มีวันที่ 31 หวังว่าจะได้คำตอบ

ขอบคุณล่วงหน้า

คำตอบ:


22

ไม่ 31 หมายถึง 31

อย่างไรก็ตามคุณสามารถใช้เล่ห์เหลี่ยมบางอย่าง ตั้งค่าให้ทำงานในวันใดก็ได้ซึ่งอาจเป็นวันสุดท้ายของเดือน (เช่น 28-31 ในฟิลด์ day-of-month) จากนั้นแทนที่คำสั่งของคุณด้วยนิพจน์เชลล์ที่ประกอบไปด้วยการทดสอบวันที่ คำสั่ง:

0 0 28-31 * * [ "`date +%m`" != "`date --date=tomorrow +%m`" ] && command

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

ฉันควรจะบอกว่าฉันไม่ได้ประดิษฐ์สิ่งนี้ - ฉันพบมันด้วย Google ที่รวดเร็วในการโพสต์รายชื่อผู้รับจดหมายโดย Matthew Jarvis ฉันคิดว่านี่เป็นกลอุบายของ Unix ตัวเก่าที่มีมาตรฐาน


1
ไม่สามารถใช้กลอุบายที่เก่าแก่เกินไปซึ่งกำหนดตัวเลือกเฉพาะของ GNU เป็น "date" =)
jj33

4
ในเว็บไซต์ stackexchange การถามคำถามที่สามารถตอบได้ด้วยการค้นหาของ Google นั้นไม่ใช่เรื่องเลวร้าย ในความเป็นจริงมันเป็นสิ่งที่ดีเพราะคนต่อไปที่จะค้นหาสิ่งนี้ใน Google จะพบคำตอบใน stackexchange และมาที่นี่
miernik

12

ไม่ฉันคิดว่าสิ่งที่ดีที่สุดที่คุณสามารถทำได้คือเที่ยงคืนในวันที่ 1 ของเดือนหรือตั้งค่า crontab แต่ละบรรทัดในแต่ละเดือน (หรืออย่างน้อยก็บรรทัดต่อเดือนที่มี 28,29,30 และ 31 วัน)

0 0 28,29 2               * /my/command
0 0 30    4,6,9,11        * /my/command
0 0 31    1,3,5,7,8,10,12 * /my/command

ขอบคุณพอล! ฉันจะติดตามคนที่สอง สำหรับวิธีที่สองฉันต้องตั้งค่าไฟล์เดียวกันสามครั้งใช่ไหม? ขอขอบคุณอีกครั้ง :)

ใช่คุณจะต้องทำซ้ำ
Paul Dixon

7
ฉันไม่มีประสบการณ์กับ cron แต่จะไม่ "0 0 28,29 2" ทำงานสองครั้งในปีอธิกสุรทินหรือไม่? ไม่ว่าเรื่องนี้จะเป็นปัญหาสำหรับสองปีข้างหน้า แต่ยังคง ...
Wim สิบ Brink

นั่นเป็นจุดที่ดีไม่มีวิธีที่ง่ายรอบที่
พอลดิกสัน

4

crontabผมไม่คิดว่าคุณสามารถทำเช่นนี้ได้อย่างง่ายดายใน

ทางเลือกหนึ่งคือการตั้งค่าcronให้เรียกใช้สคริปต์ทุกวันจากนั้นให้ตรวจสอบสคริปต์เองว่าเป็นวันสุดท้ายของเดือนหรือไม่


3

ฉันคิดว่า cron มีอักขระพิเศษ 'L' สำหรับการนี้:

*    *    L    *    *    your_script.sh 

จะรันสคริปต์ของคุณในวันสุดท้ายของทุกเดือน

ในทางกลับกัน,

*    *    0    *    *    your_script.sh

คุณสามารถระบุสิ่งที่ชอบ:

*    *    *    *    1,5L    your_scrript.sh

เพื่อเรียกใช้สคริปต์ในวันจันทร์และวันศุกร์สุดท้ายของแต่ละเดือน

หรือ

*    *    *    *    1    your_script.sh

เพื่อเรียกใช้สคริปต์ทุกวันจันทร์เวลาเที่ยงคืน


0

สิ่งนี้จะทำงาน:

if [ $( date +%-d --date="tomorrow" ) -eq 1 ]
then echo Last day of the current month
else echo Not yet!
     exit 0
fi

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