cron Vs. uyku - verimli işlemci / bellek kullanımı açısından hangisi daha iyi?


18

Durum:

Bazı komutları / komut dosyasını belirli zaman aralıklarında çalıştırmam gerekiyor ve bunun için iki seçeneğim var:

  1. kurmak cron-job
  2. sleepbetiğin içinde bir döngü uygulayın .

Soru:

Kaynak tüketimi açısından hangisi daha iyi bir seçenek, neden? Mı crondaha iyi bir yolu? Cron bir tür tetikleyici kullanıyor mu yoksa diğerine göre verimli kılan bir şey kullanıyor mu? Cron işleri kontrol etmek ve başlatmak için hangi prosedürü kullanıyor?

Yanıtlar:


14

Daha iyi ve daha standart bir uygulama olduğu için cron kullanın. En azından bu düzenli olarak çalışacak bir şeyse (sadece bir dakikada bir araya geldiğiniz bir şey değil). crondaha temiz ve daha standart bir yol. Kabuğu bir terminalden ayrılmış olarak çalıştırdığı için daha iyidir - yanlışlıkla sonlandırma ve diğer işlemlere bağımlılıklarla ilgili bir sorun yoktur.

Kaynaklar ile ilgili olarak: CPU: Her iki süreç de uyuyor - uyuduklarında CPU israf etmiyorlar. cronşeyleri kontrol etmek için daha sık uyanır, ancak yine de bunu yapar (işleminiz için artık yok). Ve bu ihmal edilebilir bir yük, çoğu cin zaman zaman uyanıyor. Bellek: Muhtemelen cronbu işlemden bağımsız olarak çalışıyorsunuz, bu yüzden bu hiç bir yük değil. Bununla birlikte, cron yalnızca komut dosyası çağrıldığında kabuğu başlatır, ancak komut dosyanız belleğe yüklenmeye devam eder (her şeyi kabuk değişkenlerine yüklemediğiniz sürece, ortam ile bir bash işlemi - birkaç kilobayt).

Sonuçta, kaynaklar için önemli değil.


19

Kullan cron(veyaanacron ) .

Cron, işleri aralıklarla çalıştırmak için tasarlanmıştır. Yaptığı tek şey bu, ve bugün olduğu gibi yapmak için yıllardır cron'a çok fazla çalışma yapıldı.

Senaryonuzda daha iyi bir programlayıcı yazma şansınız etkili. Cron kullanmak daha iyi çalışır, kodunuzda gereksiz kod bulundurmaktan kaçının ve kodunuzu kısa ve daha bakımlı tutun.

Gerekmiyorsa tekerleği yeniden icat etmeyin.


10

Şimdiden bazı iyi cevaplar var cron ve sleepperformans var, ancak bir tür özellik karşılaştırması eklemek istiyorum.

Profesyonel cron:

  • zaten Unix / Linux sistemlerinde çalışıyor
  • istikrarlı ve kanıtlanmış
  • arka plan işlemleri için tasarlandı
  • sistem başlangıcından itibaren çalışır ve yüklendikten sonra komut dosyanız da
  • uzun dönemli döngülerin daha kolay girişi (saat, gün, hafta)
  • karmaşık uzun vadeli tekrarlara izin verir ("her ikinci Pazar günü 05: 35'te")

Profesyonel sleep:

  • bir senaryoda bakımı daha kolay
  • ön plan işlemleri için daha kolay
  • uyku sürelerinin bir dakikadan daha kısa ve daha hassas olmasını sağlar
  • karmaşık uyku / eylem döngülerine izin verir ("bu kısmı çalıştır, sonra 10 saniye uyu, sonra diğer kısmı çalıştır ve iki saat uyu")

4

Cron bir tür tetikleyici kullanıyor mu yoksa diğerine göre verimli kılan bir şey kullanıyor mu?

Bir göz attım cat /proc/`pidof crond`/stack. crondArt arda birkaç kez yazdırdıktan sonra sadece hrtimer_nanosleep içinde uyuduğunu görüyorum.

>cat /proc/`pidof crond`/stack
[<ffffffff810a0614>] hrtimer_nanosleep+0xc4/0x180
[<ffffffff810a073e>] sys_nanosleep+0x6e/0x80
[<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

sleep yardımcı programı aynı sistem çağrısını kullanır.

>sleep 100 &
[1] 12761
>cat /proc/12761/stack
[<ffffffff810a0614>] hrtimer_nanosleep+0xc4/0x180
[<ffffffff810a073e>] sys_nanosleep+0x6e/0x80
[<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

Her iki yardımcı programın ( crond& sleep) düşük CPU kullanımına sahip olması gerektiğini ve sizi taklit cronetmeniz gerekiyorsa kesinlikle kullanabileceğini varsayıyorum sleep.

Güncelleme. İle olan crondfaaliyetini gözlemlemek daha iyidir

strace -p `pidof crond`

Son derece az cevap.
Hashim

3

Aradığınız ana fark cron, sürekli çalışmıyor olmasıdır. Açıklandığı gibi man cron:

   cron then wakes up every minute, examining all stored crontabs,  check
   ing  each  command  to  see  if it should be run in the current minute.
   When executing commands, any output is  mailed  to  the  owner  of  the
   crontab (or to the user named in the MAILTO environment variable in the
   crontab, if such exists).  The children copies of  cron  running  these
   processes  have their name coerced to uppercase, as will be seen in the
   syslog and ps output.

Başka bir deyişle, cronsadece dakikada bir başlatılacak ve çalıştırılıp çalıştırılmayacağını test edecektir. Uyku yaklaşımınız ise gerçek sleepkomutunuzu, kabuğunuzu, terminalinizi vewhile (veya herhangi bir şeyin) döngüsünün aynı anda çalışmasını gerektirir.

Aynı sayıda işlemi başlatsalar bile crondaha iyi olurdu. Tam olarak bunun için işlerinde çok iyi olma eğiliminde olan insanlar tarafından yazılmıştır. Basit bir kabuk döngüsünden daha iyi bir iş yapmak zorunda.


5
Her iki uyku - etkili bir fark yoktur. Uyuyan kabuğunuz da sadece uyku süresi dolduğunda uyanır. Cron'dan daha fazla CPU kullanmaz. Herhangi bir şey varsa, cron daha sık uyanır, çünkü bir şeyin değişip değişmediğini kontrol etmesi gerekir, ancak süreciniz her zaman uyur. Bununla birlikte, başka bir bash işlemi yüklüyorsunuz (yine de çalışan cron'a ek olarak), bu yüzden biraz daha fazla RAM (birkaç kB) kullanıyor.
orion

3

Fark, uykuya ihtiyaç duyan daha fazla komut dosyası ekledikçe, uyanan ve daha sonra bir sonraki çalışmaya kadar kapanacak zamanlanmış komut dosyalarını çalıştıran tek bir işlem (cron) yerine, daha fazla işlemin beklemede kalmasıyla sonuçlanacak. Cron, diğer komut dosyalarını zamanında çalıştırmak için uzmanlaşmış bir işleme izin verir, ayrıca cron, bir şeyin ne zaman çalıştırılacağını, haftanın veya ayın günlerini, belirli süreleri veya sadece her 5 dakikada bir vb.

* Bunu tekrar görmek beni cronun başka bir avantajı hakkında düşündürdü. Periyodik olarak çalışan tüm komut dosyaları tek bir yerde bulunur ve oradan ne zaman ve ne sıklıkta çalışacaklarını kontrol etmek kolaydır. Aksi takdirde tek tek komut dosyalarını kontrol etmeniz gerekir.


1

Zaten iyi ve daha bilgili cevaplar var, ama sadece sleep, diğer değişkenlerin bir fonksiyonu olarak, süreci değişken süre boyunca dondurma yeteneğine sahip olduğunuzu belirtmek istedim .

Kalan pilin yüzdesini kontrol etmek için komut dosyası yazıyorsam ve notify-sendönceden tanımlanmış kritik seviyenin altındaysa, komut dosyasını sleepher bir pili kontrol etmek yerine yüzde olarak geçerli pil seviyesinin bir işlevi olan süre için yapabilirim son kontrol edildiğinde% 80 olduğunu bildiğimde bile cron yardımı ile bir veya iki dakika.

Battery_notify.sh

#!/bin/bash
CRIT=15
while true; do
    # current battery level
    BAT_LEVEL=`acpi -b |grep -Eo "[0-9]+%"|grep -Eo "[0-9]+"`
    interval=$((($BAT_LEVEL -$CRIT) * 120)) # loose estimate of backup time for each percentage of battery charge.
    # Is AC plugged in?
    state=`acpi -b |grep -Eo "[A-Za-z]+harging"` 
    #only notify if not Plugged in
    if [ "$state" = "Discharging" ] ; then
        # is battery below CRIT level?
        if [ $BAT_LEVEL -le $CRIT ]; then
        aplay ~/apert.wav &
        notify-send "Battery-Low!!!" -i /home/bibek/batt.png -t 900
        sleep 100  # nag me each 100 secs untill I plug the thing 
        else
            sleep $interval
        fi
    else
        # if plugged in sleep 
        if [ $BAT_LEVEL -le $CRIT ]; then
            sleep $interval
        else
            # to check if the AC is unplugged before battery gains charge above CRIT.
            sleep 100 
        fi
    fi
    done

0

Tek bir iş sleepyerine kullanmak crondaha verimli olabilir. Ancak genellikle cronher durumda koştuğunuz için, onu kullanmak ücretsizdir veya hiçbir fark yaratmayacak kadar yakındır. Aksi takdirde cron, gömülü olmayan bir sistemde değilseniz , ben giderdim cron.

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.