Her 5 saniyede bir komut dosyaları nasıl çalıştırılır?


66

Her beş saniyede bir çalışması gereken bir senaryom var. Bunun cronher dakika işi yapabileceğini biliyorum ama her saniyede bir şey yapmanın bir yolu var mı?


3
Ne problemi çözmeye çalışıyorsun? Cron'un doğru çözüm olduğundan emin misiniz?
andol

1
Cron'un doğru çözüm olmadığını biliyorum. Sorunun içinde olmadığını söylüyordum. Lütfen oku. Her 5 saniyede bir komut dosyası çalıştırmaya çalışıyorum.
myusuf3 19

2
Üzgünüm, sanırım soruyu biraz yanlış anladım. Yine de, doğru sorunu çözmeye çalışıyor musunuz hala merak ediyorum.
andol

Buraya gelen insanlar için her 5 saniyede bir nasıl çalışacağını arayanlar. Bunun yerine, örnek olarak socket.io gibi araçlarla gerçek zamanlı programlamayı öğrenmeye bakmanızı şiddetle tavsiye ederim.
Brandon Bertelsen

Beşinci uyku komutunu keşfettiniz mi? sleep 5duraklatır (belki bir döngü içinde) 5 saniye boyunca) ...?
SDsolar

Yanıtlar:


64

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.shYukarıdaki içeriğe sahip bir dosya oluşturabilir ve çalıştırabilirsiniz sh my-task.sh. İsteğe bağlı supervisorolarak, 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 .


PHP tabanlı kazıyıcılarda kullanılmak için her 5 veya daha az saniyede bir çalışan bir cron gerekebilir.
Ravish Kumar

Gerçekten yanlış hissediyor. Bir cron işine dahil ederseniz, her dakika çakışan işlere sahip olursunuz. Bir saat sonra her 5 saniyede 60 iş başlayacak. Bir cron işine dahil edilmezseniz, onu nasıl durduracağınızı ya da var olduğunu bile bilmeyebilirsiniz.
Sef

35

Bir olabilirdi croniş 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?


1
/mediaOtomatik olarak yedeklemeler için
USB'ye taktığım

32
What on EARTH- İstatistikler, çöp toplama, dosya senkronizasyonu, çevrimiçi durum, siz adlandırın.
ruX

3
Gerçek zamanlıya yakın veriler için harici API'ye referans. Her 5 saniyede bir çalışan istek, her sayfa görünümünde yapmaktan çok daha iyidir.
Sergey Kudriavtsev

1
Crontab dostuff.sh dosyasını iki defa çalıştırırsa ne olur? Örneğin 55. saniyede, komut dosyası yürütüldü ancak henüz bitmedi, ancak cron komut dosyasını tekrar çağırır, ne olacak?
TomSawyer 14:16

2
BU KÖTÜ! Komut dosyası , bir defada birden çok kez çalıştırılır (5 saniyeden uzun sürerse), erişilen herhangi bir (hatta geçici) dosyada yarış durumuna neden olabilir. Aynı şeyi aynı anda iki kez yapmak, bir soruna neden olabilir! (Ve bu genellikle olur!)
Nonny Moose

27

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-scriptdosya /tmp/stop-my-scriptmevcut değilken sadece döngüye girmek için başka bir koşul kullanabilirsiniz .


Ve işareti eklersem, diyor 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.
Tyler Collier,

1
@TylerCollier ./your-scriptArka 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.
Eliah Kagan

@EliahKagan FWIW, Zsh üzerinde çalışıyor (sözdizimi hatası yok), ancak gerçekten gerekli değil. Düzenleme için teşekkürler!
saat

10

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."


Tam olarak aradığım şey buydu. Teşekkür ederim!
SDsolar

Lütfen buradaki soruma cevap olarak gönderin: askubuntu.com/questions/922216/… bu yüzden cevabınızı kabul edebilirim.
SDsolar



mcrongerektirir sendmailyüklü ve varsayılan olarak etkinleştirilmesini. nasıl devre dışı bırakılır?
ihsan

2

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


Kuvars açık kaynak değil gibi görünüyor. Bu doğru mu?
txwikinger

Açık kaynak kodlu bir sürümü var. Bir sayfası yok ama sadece indirme sayfasına gidin. Formu doldurmanız gerekmez, sadece beni indirmek için tıklayın.
Cody Harlow,

en az 2018 itibariyle açık kaynak gibi görünüyor. github.com/quartz-scheduler/quartz
dogmatic69

2

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.


1
Bunun nasıl yapılacağı hakkında ayrıntılı bilgi vermek için bu cevabı düzenlemenizi öneririm . (Ayrıca bkz İyi bir cevap yazmak nasıl? Cevapların türlü Ask Ubuntu en değerli kabul yaptığınız hakkında genel öneri niteliğinde değildir.)
David Foerster

2

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.serviceve 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.


1
En iyi çözüm, tek dezavantajı, cron'un genel bakış ve konfigürasyonu daha kolay olmasıdır. SystemD bir acıdır ve dizin yapısıyla başlar. Yine de 5 saniyelik bir aralık için en iyisi
John

Yukarıdaki snippet, mystuff.service yerine /etc/systemd/system/mystuff.timer dosyasına girmez mi?
Brooks,

@ Brooks: evet, benim kötü - kötü kopya ve benim tarafımda yapıştırın. Sabit.
Guss

Teşekkürler ... Systemd öğrenirken deli olmadığımı bilmek sevindim :)
Brooks

1

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.


8
Neden whilebetiği tekrar tekrar başlatmak yerine bir döngü kullanmıyorsunuz ?
David Z
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.