ฉันต้องการทราบว่ามีวิธีที่ง่ายกว่าในการทำงานทุก ๆ 25 นาทีหรือไม่ ใน cronjob ถ้าคุณระบุพารามิเตอร์นาทีเป็น * / 25 มันจะทำงานเฉพาะในนาทีที่ 25 และ 50 ของทุกชั่วโมง
ฉันต้องการทราบว่ามีวิธีที่ง่ายกว่าในการทำงานทุก ๆ 25 นาทีหรือไม่ ใน cronjob ถ้าคุณระบุพารามิเตอร์นาทีเป็น * / 25 มันจะทำงานเฉพาะในนาทีที่ 25 และ 50 ของทุกชั่วโมง
คำตอบ:
คำสั่งใน crontab จะถูกดำเนินการด้วย/bin/sh
ดังนั้นคุณสามารถใช้การขยายตัวทางคณิตศาสตร์เพื่อคำนวณว่าโมดูโลนาทีปัจจุบัน 25 เท่ากับศูนย์หรือไม่:
*/5 * * * * [ $(( $(date +\%s) / 60 \% 25 )) -eq 0 ] && your_command
cron
จะทำงานนี้รายการทั้งหมดทุก 5 นาที แต่ถ้านาทีปัจจุบัน (นาทีนับตั้งแต่ยุค) โมดูโล 25 your_command
เท่ากับศูนย์มันจะทำงาน
ดังที่คนอื่น ๆ ชี้ให้เห็นว่า 1 วันนั้นไม่สามารถหารได้อย่างสม่ำเสมอภายใน 25 นาทีดังนั้นสิ่งนี้จะไม่ทำให้เกิดyour_command
การเรียกใช้ในเวลาเดียวกันทุกวัน แต่จะทำงานทุก 25 นาที
ทางออกที่ดีที่สุดของคุณคือการทำงานที่ 20 นาทีหรือ 30 นาที
ถัดไปที่ดีที่สุดคุณอาจจะทริกเกอร์ทุก 5 นาทีจากนั้นให้นับภายในหรือเวลาและเรียกใช้ทุกทริกเกอร์ที่ 5 หรือ 25 นาทีผ่านไปนับตั้งแต่การวิ่งครั้งสุดท้าย
ซับซ้อนมากขึ้นคือการหาเวลาที่ถูกต้องสำหรับหนึ่งวันเริ่มตั้งแต่เที่ยงคืนและยอมรับข้อผิดพลาดในตอนท้ายของวัน สิ่งนี้จะเกี่ยวข้องกับการทำสำเนารายการ crontab เป็นชั่วโมงที่แตกต่างกัน
ซับซ้อนยิ่งกว่านั้นคือการหาเวลาตลอดทั้งเดือนซึ่งจะเกี่ยวข้องกับสำเนาของรายการ crontab จำนวนมากเพื่อให้ครอบคลุมชุดค่าผสมที่แตกต่างกัน
ในที่สุดคุณสามารถใช้ daemon ของคุณเองได้ตลอดเวลาและกำหนดเวลาทำเช่นนั้น
ฉันไม่มีประสบการณ์โดยตรงกับมัน แต่fcronดูเหมือนจะทำสิ่งที่คุณต้องการออกจากกล่อง ตามเอกสารคุณสามารถระบุความถี่:
# Get our mails every 30 minutes
@ 30 getmails -all
# make some security tests every 48 hours of system up time,
# force a mail to be sent to root even if there is no output
@mailto(root),forcemail 2d /etc/security/msec/cron-sh/security.sh
@ 25 command
ควรทำเคล็ดลับ
ให้ฉันอธิบายสั้น ๆ ว่าปัญหาคืออะไรที่นี่ การป้อน 25 ในฟิลด์นาทีทำให้เกิดcron
การดำเนินการเมื่อนาทีของเวลาปัจจุบันเท่ากับ 25 นั่นคือหนึ่งครั้งต่อชั่วโมง คุณสามารถป้อนรายการการแข่งขันปัญหาคือว่า 60 (นาทีต่อชั่วโมง) ไม่สามารถหารด้วย 25 ดังนั้นคุณต้องเพิ่มหลายรายการตามชั่วโมง ตัวคูณร่วมที่น้อยที่สุดของ 60 & 25 คือ 300 นั่นคือ 5 * 60 ดังนั้นคุณจะต้องวนรอบ 5 ชั่วโมงจนกว่าจะกลับไปเริ่มต้นดั้งเดิม ตัวอย่างเช่น:
0, 25, 50
15, 40
5, 30, 55
20, 45
10, 35
...
แต่ที่นี่อีกครั้ง 24 (ชั่วโมงต่อวัน) หารด้วย 5 ไม่ได้ตัวคูณร่วมที่น้อยที่สุดของ 5 และ 24 คือ 5 * 24 = 120 และต่อไปเรื่อย ๆ ...
คุณสามารถเล่นกับเวลาแก้ไขล่าสุดของไฟล์
สร้างสคริปต์เล็กน้อย (ตัวอย่าง/usr/local/bin/age
) ที่จะแสดงอายุของไฟล์:
#bin/sh
echo $(( $( date +%s ) - $( stat -c %Z $1 ) ))
crontab ของคุณจะมีลักษณะเช่นนี้ (สมมติว่า 25 นาทีเท่ากับ 1,500 วินาทีถ้าฉันพูดถูก)
* * * * * [ $(/usr/local/bin/fileage /var/tmp/your_command.offset) -gt 1500 ] && touch /var/tmp/your_command.offset && your_command
โปรดทราบว่าฉันใช้/var/tmp
แทน/tmp
เพราะเป็นไปตามFHSไม่ควรจะถูกลบในการปิดระบบ / เริ่มต้น
ฉันคิดว่าสิ่งต่อไปนี้ควรใช้งานได้ 0 0/25 * * *?