Yanıtlar:
İşi her on saniyede bir planlayamazsınız, ancak işi her dakika çalışacak şekilde zamanlayabilir ve 10 saniye aralıklarla bir döngüde uyuyabilirsiniz. Bu, on saniyelik aralık sona ermeden önce komutunuzun tamamlanmasıyla ilgili olabilir veya bir sonraki komut çalıştığında çakışır. Bu güvencesiz bir çözüm gibi geliyor, ancak komut dosyasının ana komutunun çok kısa bir şekilde yürütülmesini garanti ederseniz, işe yarayacaktır.
#!/bin/bash
i=0
while [ $i -lt 6 ]; do
/run/your/command &
sleep 10
i=$(( i + 1 ))
done
Geçen hafta benzer bir görevim vardı. Çözümlerim standart cron girişlerini istenen frekansa çarpmaktı. Crontab'ım şöyle:
* * * * * /usr/local/bin/php /var/www/myscript.php
* * * * * sleep 10; /usr/local/bin/php /var/www/myscript.php
* * * * * sleep 20; /usr/local/bin/php /var/www/myscript.php
* * * * * sleep 30; /usr/local/bin/php /var/www/myscript.php
* * * * * sleep 40; /usr/local/bin/php /var/www/myscript.php
* * * * * sleep 50; /usr/local/bin/php /var/www/myscript.php
Myscript.php sonuçlarını kontrol etmek istiyorsanız, örneğin hata ayıklama için, sadece
&> /tmp/myscipt.log
yukarıdaki crontab'daki her satıra. Sonra stderr ve stdout günlük dosyasına yönlendirilir.
Monit kullanır ve döngü süresini 10 saniyeye ayarlarım. Bu, cron sisteminin dışında bunu yönetmenin temiz bir yoludur.
Bunu 15 saniyelik aralıklarla çalıştırılması gereken belirli komut dosyalarıyla yapıyorum.
Bakınız: zfs havuzunun artımlı / sürekli yedeklemeleri nasıl yapılır?
10 saniyenin altına, örneğin 5 saniyeye gitmek istiyorsanız, böyle bir komut dosyasıyla bir işçi döngüsü oluşturmanızı öneririz:
#!/bin/bash
INTERVAL=5
while true; do
echo "do something"
# wait for next interval
WAIT_UNTIL=$(($(date +%s) + $INTERVAL))
while [ $(date +%s) -lt $WAIT_UNTIL ]; do
sleep 1
done
done
İkinci saniyeye gitmeniz gerekiyorsa, tarih komutuna mikrosaniye ekleyin.
* * * * * script to run
* * * * * sleep 10; script to run
* * * * * sleep 20; script to run
Burada komut dosyası 10 saniyelik aralıklarla çalıştırılabilir ...