cron Vs. Schlaf - Welcher ist der bessere im Hinblick auf eine effiziente CPU- / Speicherauslastung?


18

Der Fall:

Ich muss in bestimmten Zeitabständen einige Befehle / Skripte ausführen und dazu habe ich zwei Möglichkeiten:

  1. einen cron-job einrichten
  2. Implementieren Sie eine Schleife mit sleepim Skript selbst.

Frage:

Welche Option ist aus Sicht des Ressourcenverbrauchs besser, warum? Ist cronder bessere weg Verwendet cron irgendwelche Trigger oder etwas, das es effizienter macht als das andere? Wie prüft und startet cron die Jobs?

Antworten:


14

Verwenden Sie cron, da dies eine bessere und üblichere Vorgehensweise ist. Zumindest, wenn dies regelmäßig ausgeführt wird (nicht nur etwas, das Sie in einer Minute zusammengefügt haben). cronist ein sauberer und standardmäßiger Weg. Es ist auch besser, weil die Shell von einem Terminal getrennt ausgeführt wird - kein Problem mit versehentlicher Beendigung und Abhängigkeiten von anderen Prozessen.

In Bezug auf die Ressourcen: CPU: Beide Prozesse werden in den Ruhezustand versetzt. Wenn sie in den Ruhezustand versetzt werden, wird keine CPU verschwendet. cronWacht öfter auf, um Dinge zu überprüfen, aber das macht es trotzdem (nicht mehr für Ihren Prozess). Und dies ist eine vernachlässigbare Belastung, da die meisten Dämonen gelegentlich aufwachen. Speicher: Sie haben wahrscheinlich cronunabhängig von diesem Prozess ausgeführt, sodass dies überhaupt kein Overhead ist. Cron startet die Shell jedoch nur, wenn das Skript aufgerufen wird, wohingegen Ihr Skript im Speicher geladen bleibt (ein Bash-Prozess mit Umgebung - einige Kilobyte, es sei denn, Sie laden alles in Shell-Variablen).

Alles in allem spielt es für Ressourcen keine Rolle.


19

Verwenden Sie cron(oder anacron).

Cron ist dafür ausgelegt, Dinge in Intervallen laufen zu lassen. Das ist das einzige, was es tut, und es wurde viele Jahre lang viel Arbeit in Cron gesteckt, um es zu dem zu machen, was es heute ist.

Die Wahrscheinlichkeit, dass Sie einen besseren Scheduler in Ihr Skript schreiben, ist gleich Null. Die Verwendung von cron funktioniert besser. Vermeiden Sie unnötigen Code in Ihrem Skript und halten Sie Ihren Code übersichtlich und wartungsfreundlicher.

Erfinden Sie das Rad nicht neu, wenn Sie es nicht müssen.


10

Es gibt bereits einige gute Antworten zu cronund sleepLeistung, aber ich möchte eine Art Funktionsvergleich hinzufügen.

Pro cron:

  • Läuft bereits auf Unix / Linux Systemen
  • stabil und bewährt
  • Entwickelt für Hintergrundprozesse
  • wird vom Systemstart an ausgeführt, und nach der Installation wird auch Ihr Skript ausgeführt
  • leichtere Eingabe von Langzeitzyklen (Stunden, Tage, Wochen)
  • erlaubt komplexe Langzeitwiederholungen ("jeden zweiten Sonntag um 5:35 Uhr")

Pro sleep:

  • einfacher in einem Skript zu pflegen
  • einfacher für Vordergrundprozesse
  • ermöglicht kürzere und präzisere Schlafzeiten als eine Minute
  • Ermöglicht komplexe Schlaf- / Aktionszyklen ("Diesen Teil ausführen, dann 10 Sekunden schlafen, dann den anderen Teil ausführen und zwei Stunden schlafen")

4

Verwendet cron irgendwelche Trigger oder etwas, das es effizienter macht als das andere?

Ich habe einen Blick darauf geworfen cat /proc/`pidof crond`/stack. Nachdem ich es ein paar Mal hintereinander gedruckt habe, sehe ich, dass es crondnur in hrtimer_nanosleep schläft.

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

sleep Dienstprogramm verwendet den gleichen Systemaufruf.

>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

Ich gehe davon aus, dass beide Dienstprogramme ( crond& sleep) eine geringe CPU-Auslastung haben müssen und dass Sie cronsie definitiv verwenden können, wenn Sie sie imitieren müssen sleep.

Aktualisieren. Es ist besser, die crondAktivität mit zu beobachten

strace -p `pidof crond`

Sehr unterschätzte Antwort.
Hashim

3

Der Hauptunterschied, den Sie suchen, ist, dass cronnicht ständig ausgeführt wird. Wie erklärt in 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.

Mit anderen Worten, cronwird nur einmal pro Minute gestartet und es wird geprüft, ob es ausgeführt werden soll. Ihr Schlafansatz würde andererseits erfordern, dass Ihr tatsächlicher sleepBefehl, Ihre Shell, Ihr Terminal und die while(oder was auch immer) Schleife gleichzeitig ausgeführt werden.

Selbst wenn sie die gleiche Anzahl von Prozessen starten cronwürden , wäre das besser. Genau dafür ist es von Leuten geschrieben, die dazu neigen, in ihrer Arbeit sehr gut zu sein. Es ist verpflichtet, einen besseren Job als eine einfache Shell-Schleife zu machen.


5
Beide schlafen - es gibt praktisch keinen Unterschied. Ihre Muschel, die schläft, wacht auch erst auf, wenn der Schlaf abgelaufen ist. Es wird nicht mehr CPU als Cron verwendet. Wenn überhaupt, wacht cron häufiger auf, weil es prüfen muss, ob sich etwas geändert hat, während Ihr Prozess die ganze Zeit schläft. Es wird jedoch ein weiterer Bash-Prozess geladen (zusätzlich zu cron, der sowieso ausgeführt wird), sodass ein bisschen mehr RAM verwendet wird (ein paar kB).
Orion

3

Der Unterschied besteht darin, dass beim Hinzufügen weiterer Skripts, die in den Ruhezustand versetzt werden müssen, mehr Prozesse warten, anstatt eines einzelnen Prozesses (Cron), der alle geplanten Skripts aufwacht und ausführt, die dann bis zur nächsten Ausführung geschlossen werden. Cron ermöglicht einen Prozess, der darauf spezialisiert ist, andere Skripte pünktlich auszuführen, und mit cron können Sie relativ frei planen, wann etwas ausgeführt werden soll, an Wochentagen oder im Monat, zu bestimmten Zeiten oder nur alle 5 Minuten usw.

* Nur als ich das noch einmal sah, dachte ich an einen weiteren Vorteil von Cron. Alle Skripte, die in regelmäßigen Abständen ausgeführt werden, befinden sich dann an einem Ort. Von dort aus können Sie leicht überprüfen, wann und wie oft sie ausgeführt werden. Ansonsten müssen Sie einzelne Skripte überprüfen.


1

Es gibt bereits gute und fundiertere Antworten, aber ich wollte nur darauf hinweisen, dass sleepSie mit die Möglichkeit haben, den Prozess für eine variable Zeitdauer einzufrieren, etwa als Funktion einiger anderer Variablen.

Wenn ich ein Skript schreibe, um den Prozentsatz der verbleibenden Batterie zu überprüfen, und notify-sendwenn dieser unter dem vordefinierten kritischen sleepWert liegt, kann ich das Skript für die Zeitdauer erstellen, die eine Funktion des aktuellen Batteriestands in Prozent ist, anstatt die Batterie alle zu überprüfen Ein oder zwei Minuten mit Hilfe von Cron, auch wenn ich weiß, dass es beim letzten Check 80% waren.

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

Die Verwendung von sleepanstelle von cronfür einen einzelnen Job ist möglicherweise effizienter. Aber da Sie in der Regel cronin jedem Fall ausgeführt haben, ist die Verwendung kostenlos, oder es ist nahezu ausreichend, da dies keinen Unterschied macht. Wenn Sie also nicht auf einem ansonsten cronkostenlosen Embedded-System arbeiten, würde ich mich entscheiden cron.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.