Her beş saniyede bir çalışması gereken bir senaryom var. Bunun cron
her dakika işi yapabileceğini biliyorum ama her saniyede bir şey yapmanın bir yolu var mı?
sleep 5
duraklatır (belki bir döngü içinde) 5 saniye boyunca) ...?
Her beş saniyede bir çalışması gereken bir senaryom var. Bunun cron
her dakika işi yapabileceğini biliyorum ama her saniyede bir şey yapmanın bir yolu var mı?
sleep 5
duraklatır (belki bir döngü içinde) 5 saniye boyunca) ...?
Yanıtlar:
Cron sadece bir dakika için izin verir. Ne olabilir do 5 saniye boyunca uyur sonra görevi çalıştırır ve sonsuz bir döngüye sahip bir kabuk yazılımı olduğunu. 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
my-task.sh
Yukarıdaki içeriğe sahip bir dosya oluşturabilir ve çalıştırabilirsiniz sh my-task.sh
. İsteğe bağlı supervisor
olarak, bir servis olarak, sistem önyüklenirken başlayacağı şekilde vb. Yapılandırabilirsiniz .
Gerçekten de yapmamanız gereken bir şey yapıyormuşsunuz gibi geliyor. Bu yanlış geliyor .
Bir olabilirdi cron
iş tekme-off senaryo 12 backgrounded süreçleri thusly başlar her dakika:
* * * * * ~/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, her 5 saniyede bir çalışması gereken DÜNYA ne yapıyor olabilirsiniz?
/media
Otomatik olarak yedeklemeler için
What on EARTH
- İstatistikler, çöp toplama, dosya senkronizasyonu, çevrimiçi durum, siz adlandırın.
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 tuşlarını kullanabilir ya da true
örneğin ! test -f /tmp/stop-my-script
dosya /tmp/stop-my-script
mevcut değilken sadece döngüye girmek için başka bir koşul kullanabilirsiniz .
bash: syntax error near unexpected token ';'
, ben de çıkardım. Bash 4.3.11 var. Komutum hızlı çalışıyor, bu yüzden ön planda çalışıyorsa sorun yok.
./your-script
Arka planda çalıştırmanız gerekiyorsa (5 saniyelik uyku sırasında), saklayabilir &
ama bırakabilirsiniz ;
. Gibi &
komutlar ayıran amacına hizmet eder, şey var gereksiz (ve görünüşe göre izin verilmiyor) var ;
aynı satırda ondan sonra. Başka bir yol, döngüyü çoklu satırlara yazmaktır (satır sonundan sonra &
ve isteğe bağlı olarak satır sonlarından do
önce ve sonra satır sonları ile done
). Yana ;
sonra &
bir yazım hatası gibi görünüyor, bunu kaldırdık. blueyed: Lütfen ;
gerçekten istersen geri koymaktan çekinmeyin ; öyleyse, bir açıklama da eklemenizi öneririm.
Bir "Vixie cron" alternatifi olan GNU paketini mcron kullanabilirsiniz .
http://www.gnu.org/software/mcron/manual/mcron.html#Top
"Daha ince zaman noktalarının kolayca tanımlanmasına izin verilebilir, yani saniyeler. Prensip olarak bu, mikrosaniyeye uzatılabilir, ancak bu uygulanmamıştır."
mcron
gerektirir sendmail
yüklü ve varsayılan olarak etkinleştirilmesini. nasıl devre dışı bırakılır?
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
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.
Her 5 saniyede bir, istediğinizi yapmak için ayarlamış olduğunuz bir servisi tetikleyecek olan SystemD zamanlayıcı birimini kullanabilirsiniz.
Servis ünitenizin çağrıldığını mystuff.service
ve yüklendiğini varsayalım /etc/systemd/system
( kullanıcının crontab'ını değiştirmek istiyorsanız, SystemD kullanıcı servislerini inceleyin ), ardından servisi başlatmak için ve ardından her 5 saniyede bir, bir zamanlayıcı ünite yazabilirsiniz:
/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ürdü). Ş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.
while
betiği tekrar tekrar başlatmak yerine bir döngü kullanmıyorsunuz ?