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:
einen cron-job einrichten
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?
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.
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.
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")
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.
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
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.
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.
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=15while 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 inif["$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
fielse# 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 100fifidone
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.
Der Hauptunterschied, den Sie suchen, ist, dass
cron
nicht ständig ausgeführt wird. Wie erklärt inman cron
:Mit anderen Worten,
cron
wird 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ächlichersleep
Befehl, Ihre Shell, Ihr Terminal und diewhile
(oder was auch immer) Schleife gleichzeitig ausgeführt werden.Selbst wenn sie die gleiche Anzahl von Prozessen starten
cron
wü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.quelle
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.
quelle
Es gibt bereits gute und fundiertere Antworten, aber ich wollte nur darauf hinweisen, dass
sleep
Sie 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-send
wenn dieser unter dem vordefinierten kritischensleep
Wert 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
quelle
Die Verwendung von
sleep
anstelle voncron
für einen einzelnen Job ist möglicherweise effizienter. Aber da Sie in der Regelcron
in 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 ansonstencron
kostenlosen Embedded-System arbeiten, würde ich mich entscheidencron
.quelle