Her beş saniyede bir çalışması gereken bir senaryom var. cron
'in her dakika işi yapabileceğini biliyorum, ama her saniyede bir şey yapmanın bir yolu var mı?
Cron sadece bir dakika için izin verir. Yapmanız gereken yapabildiğiniz, görevinizi çalıştıran sonsuz döngüye sahip bir Shell betiği yazmak ve ardından 5 saniye bekletmektir. Bu şekilde, görevin ne kadar sürdüğüne bağlı olarak göreviniz her 5 saniyede bir veya daha az çalıştırılır.
#!/bin/bash
while true; do
# Do something
sleep 5;
done
Yukarıdaki içeriğe sahip bir my-task.sh
dosyası oluşturabilir ve sh my-task.sh
ile çalıştırabilirsiniz. İsteğe bağlı olarak, bir servis olarak supervisor
ile sistem önyükleme yaparken başlayacağı şekilde yapılandırabilirsiniz.
Gerçekten de yapmamanız gereken bir şey yapıyormuşsunuz gibi geliyor. Bu yanlış hissediyor.
Bu nedenle, 12 arka planlı işlemi başlatan her dakika bir cron
işi betiğine sahip olabilirsiniz:
* * * * * ~/dostuff.sh
dostuff.sh
:
(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &
Ancak sorum şu: DÜNYA ne olursa olsun her 5 saniyede bir çalışması gereken ne yapıyor olabilirsiniz?
Sadece bir döngü kullanın:
while true ; do ./your-script & sleep 5; done
Bu, betiğinizi arka plan işi olarak başlatacak, 5 saniye uyuyacak ve tekrar döngü başlatacak. İptal etmek için Ctrl-C kullanabilirsiniz ya da true
yerine başka herhangi bir koşulu kullanabilirsiniz; ! test -f /tmp/stop-my-script
, yalnızca /tmp/stop-my-script
dosyası bulunmadığında döngü içine alır.
"Vixie cron" alternatifi olan GNU paketini mcron kullanabilirsiniz.
http://www.gnu.org/software/mcron/manual/mcron.html#Top
"Daha ince zaman noktalarının, yani saniyelerin belirlenmesine kolayca izin verebilir. Prensipte bu, mikrosaniye genişletilebilir, ancak bu uygulanmaz."
Yönlendiriciyi izlemek ve değiştirmek için kaktüsler kullanın, ancak Cron yalnızca en az bir dakika izin verir, bu nedenle bir bağlantı noktası/aygıt çökerse, iki dakika geçmeden uyarı vermez.
Cron cinsinden minimum konfigürasyon dakikadır, 5 saniye ayarlayamazsınız. Saniyeye izin veren Quartz kullanabilirsiniz. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html
Her 5 saniyede bir, istediğinizi yapacak şekilde ayarlamış olduğunuz bir servisi tetikleyecek olan SystemD zamanlayıcı birimini kullanabilirsiniz.
Servis ünitenizin mystuff.service
olarak adlandırıldığını ve /etc/systemd/system
(kurgu SystemD kullanıcı hizmetleri içinde bir kullanıcının crontab'ını değiştirmek istiyorsanız) yüklü olduğunu varsayalım. Hizmeti önyükleme zamanında ve ardından her 5 saniyede bir çalıştırmak için,
/etc/systemd/system/mystuff.timer
[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target
Ardından sistem konfigürasyonunu yeniden yükleyin, zamanlayıcı ünitesini etkinleştirin ve başlatın.
Bu tür şeyleri çok başarılı bir şekilde yaptım (ve sonuç, makine yeniden başlatılıncaya kadar bir kerede haftalarca sürecek) Şu anda ne yaptığımı gelince, bilgileri güncelleme ve önbelleğe alma - her 10 saniyede bir güncelleme.
#!/bin/sh
SLEEP=5
# do stuff
sleep $SLEEP
# do stuff
sleep $SLEEP
# do stuff
sleep $SLEEP
# do stuff
sleep $SLEEP
# echo and restart...
exec $0
'Exec $ 0' komut dosyasını yeniden başlatır, ancak çalışan komut dosyasını değiştirir. Başlangıçta bir crontab '@reboot' satırıyla başlatılabilir.