You have */30
içinde dakika belirteci - araçlarının her dakika ama (başka bir deyişle, her yarım saatte bir) 30 kişilik bir adımla. Yana cron
alt dakikalık çözünürlükleri aşağı gitmez, başka bir yol bulmak gerekir.
Bir olasılık, biraz çamur (a) olsa da , biri 30 saniye ofset olmak üzere iki işe sahip olmaktır:
# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )
Yorumları senkronize etmenin kolay olmasını sağlamak için yorum eklediğimi ve biçimlendirdiğimi göreceksiniz.
Her iki cron
iş de aslında her dakika çalışır ancak ikincisi işin "etini" uygulamadan önce yarım dakika bekler /path/to/executable
.
Diğer (non İçin cron
tabanlı) seçenekleri, burada diğer cevaplar, söz özellikle olanları görmek fcron
ve systemd
. Bunlar muhtemelen sisteminizin bunları kullanma yeteneğine sahip olduğunu varsayarsak (kurulum fcron
veya dağıtım ile dağıtım systemd
gibi).
Eğer varsa yok kludgy çözümü kullanmak istiyorum, küçük değişikliklerle bir döngü tabanlı çözümü kullanabilirsiniz. İşleminizin bir şekilde çalışmasını sağlamaya devam etmeniz gerekir, ancak bir kez sıralandığında, aşağıdaki komut dosyasının çalışması gerekir:
#!/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
İşin püf noktası, yararlı yükünüz sleep 30
çalışmaya başlamadan önce arka planda başlatmak için bir ama kullanmaktır . Sonra, yük bittikten sonra, arka planın sleep
bitmesini bekleyin .
Yükün n
saniye (burada n <= 30
) sürmesi durumunda, yükten sonraki bekleme süresi 30 - n
saniye olacaktır . O alırsa daha 30 saniyeden yükü artık bitmiş, ama kadar, bir sonraki döngü gecikecektir.
Çıktıyı takip etmeyi kolaylaştırmak için bir dakikalık bir sınırda başlamak için orada hata ayıklama kodum olduğunu göreceksiniz. Ayrıca, maksimum yük kapasitesini de kademeli olarak artırıyorum, böylece yükün 30 saniyelik döngü süresini aştığını göreceksiniz (ekstra bir boş satır çıktı, böylece etki açıktır).
Bir örnek çalışma takip eder (döngüler normalde bir önceki döngüden 30 saniye sonra başlar):
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 çözümünden kaçınmak istiyorsanız, bu muhtemelen daha iyidir. cron
Bu komut dosyasının çalışıp çalışmadığını düzenli aralıklarla saptamak için bir işe (veya eşdeğerine) ihtiyacınız vardır ve eğer başlamazsa başlatın. Ancak betiğin kendisi zamanlamayı işler.
(a) Bazı çalışma arkadaşlarım kludge'ların benim uzmanlık alanım olduğunu söyler :-)