คุณมี*/30
ตัวระบุนาที - นั่นหมายถึงทุกนาที แต่ด้วยขั้นตอนที่ 30 (กล่าวคือทุกครึ่งชั่วโมง) เนื่องจากcron
ไม่ได้ไปที่ความละเอียดช่วงเวลาย่อยคุณจะต้องหาวิธีอื่น
ความเป็นไปได้ทางหนึ่งถึงแม้ว่ามันจะเป็น kludge (a)แต่ก็มีสองงาน แต่หนึ่งออฟเซ็ตภายใน 30 วินาที:
# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )
คุณจะเห็นว่าฉันได้เพิ่มความคิดเห็นและจัดรูปแบบเพื่อให้แน่ใจว่ามันจะทำให้ข้อมูลตรงกันได้ง่าย
ทั้งcron
งานที่ทำงานจริงทุกนาที แต่หลังหนึ่งจะรอครึ่งนาทีก่อนที่จะดำเนินการ "เนื้อ" /path/to/executable
ของงาน
อื่น ๆ (ไม่ใช่cron
ชั่น) ตัวเลือกให้ดูคำตอบอื่น ๆ ที่นี่โดยเฉพาะอย่างยิ่งคนที่กล่าวขวัญและfcron
systemd
สิ่งเหล่านี้น่าจะดีกว่าถ้าสมมติว่าระบบของคุณมีความสามารถในการใช้ (เช่นติดตั้งfcron
หรือมี distro systemd
ภายใน)
หากคุณไม่ต้องการใช้โซลูชัน kludgy คุณสามารถใช้โซลูชันแบบวนซ้ำพร้อมการปรับเปลี่ยนเล็กน้อย คุณจะยังต้องจัดการให้กระบวนการของคุณทำงานในบางรูปแบบ แต่เมื่อเรียงลำดับแล้วสคริปต์ต่อไปนี้ควรใช้งานได้:
#!/bin/env bash
# Debug code to start on minute boundary and to
# gradually increase maximum payload duration to
# see what happens when the payload exceeds 30 seconds.
((maxtime = 20))
while [[ "$(date +%S)" != "00" ]]; do true; done
while true; do
# Start a background timer BEFORE the payload runs.
sleep 30 &
# Execute the payload, some random duration up to the limit.
# Extra blank line if excess payload.
((delay = RANDOM % maxtime + 1))
((maxtime += 1))
echo "$(date) Sleeping for ${delay} seconds (max ${maxtime})."
[[ ${delay} -gt 30 ]] && echo
sleep ${delay}
# Wait for timer to finish before next cycle.
wait
done
เคล็ดลับคือการใช้sleep 30
แต่จะเริ่มในพื้นหลังก่อนที่จะโหลดข้อมูลของคุณทำงาน จากนั้นหลังจากที่บรรจุเสร็จแล้วเพียงรอให้พื้นหลังsleep
เสร็จสิ้น
หากเพย์โหลดใช้เวลาไม่n
กี่วินาที (ที่n <= 30
) การรอหลังจากเพย์โหลดจะเป็น30 - n
วินาที ถ้าจะใช้เวลามากขึ้นกว่า 30 วินาทีจากนั้นรอบถัดไปจะเลื่อนออกไปจนกว่าอัตราเสร็จสิ้น แต่อีกไม่นาน
คุณจะเห็นว่าฉันมีรหัสการแก้ปัญหาที่นั่นเพื่อเริ่มต้นในขอบเขตหนึ่งนาทีเพื่อให้เริ่มต้นได้ง่ายขึ้นในการติดตาม ฉันยังค่อยๆเพิ่มเวลาในการโหลดสูงสุดดังนั้นในที่สุดคุณก็จะเห็นว่าส่วนของข้อมูลนั้นเกินกว่ารอบเวลา 30 วินาที (บรรทัดว่างพิเศษจะถูกส่งออกเพื่อให้เห็นผลได้ชัดเจน)
ตัวอย่างวิ่งดังนี้ (โดยปกติวงจรเริ่มต้น 30 วินาทีหลังจากรอบก่อนหน้า):
Tue May 26 20:56:00 AWST 2020 Sleeping for 9 seconds (max 21).
Tue May 26 20:56:30 AWST 2020 Sleeping for 19 seconds (max 22).
Tue May 26 20:57:00 AWST 2020 Sleeping for 9 seconds (max 23).
Tue May 26 20:57:30 AWST 2020 Sleeping for 7 seconds (max 24).
Tue May 26 20:58:00 AWST 2020 Sleeping for 2 seconds (max 25).
Tue May 26 20:58:30 AWST 2020 Sleeping for 8 seconds (max 26).
Tue May 26 20:59:00 AWST 2020 Sleeping for 20 seconds (max 27).
Tue May 26 20:59:30 AWST 2020 Sleeping for 25 seconds (max 28).
Tue May 26 21:00:00 AWST 2020 Sleeping for 5 seconds (max 29).
Tue May 26 21:00:30 AWST 2020 Sleeping for 6 seconds (max 30).
Tue May 26 21:01:00 AWST 2020 Sleeping for 27 seconds (max 31).
Tue May 26 21:01:30 AWST 2020 Sleeping for 25 seconds (max 32).
Tue May 26 21:02:00 AWST 2020 Sleeping for 15 seconds (max 33).
Tue May 26 21:02:30 AWST 2020 Sleeping for 10 seconds (max 34).
Tue May 26 21:03:00 AWST 2020 Sleeping for 5 seconds (max 35).
Tue May 26 21:03:30 AWST 2020 Sleeping for 35 seconds (max 36).
Tue May 26 21:04:05 AWST 2020 Sleeping for 2 seconds (max 37).
Tue May 26 21:04:35 AWST 2020 Sleeping for 20 seconds (max 38).
Tue May 26 21:05:05 AWST 2020 Sleeping for 22 seconds (max 39).
Tue May 26 21:05:35 AWST 2020 Sleeping for 18 seconds (max 40).
Tue May 26 21:06:05 AWST 2020 Sleeping for 33 seconds (max 41).
Tue May 26 21:06:38 AWST 2020 Sleeping for 31 seconds (max 42).
Tue May 26 21:07:09 AWST 2020 Sleeping for 6 seconds (max 43).
หากคุณต้องการหลีกเลี่ยงโซลูชัน kludgy นี่น่าจะดีกว่า คุณยังจะต้องมีcron
งาน (หรือเทียบเท่า) เพื่อตรวจสอบว่าสคริปต์นี้ทำงานอยู่หรือไม่และหากไม่เริ่มต้น แต่สคริปต์ก็จัดการเวลา
(a)เพื่อนร่วมงานของฉันบางคนจะบอกว่า kludges เป็นพิเศษของฉัน :-)