Kann ich cron "zufällig" machen?

17614
warren

Vielleicht bin ich völlig verrückt, und wenn ja, ist das in Ordnung. Aber wie würde ich einen Job einplanen, um nach einem zufälligen Zeitplan eine doofe Nachricht auszusenden, wie von fortune?

Klarstellung
Ja - dies ist mein persönlicher Arbeitsplatz - ich habe nicht vor, etwas Ungewöhnliches auf einem Produktionsserver zu tun :)

12

4 Antworten auf die Frage

13
Andy Lee Robinson

Ich habe viele Befehle in / etc / crontab, die alle möglichen Dinge tun, und manche benötigen Präzision in Sekunden. Jetzt kann cron eine feinere Auflösung haben, wobei alle Zeiten sichtbar und zentral gehalten werden.

In diesem Beispiel wird eine Webseite zwischen 10 und 50 Sekunden vor allen 5 Minuten abgerufen und analysiert:

4-59/5 * * * * root (sleep $(($RANDOM\%40+10))) && /etc/munin/plugins/someplugin prefetch 

Es muss keine genaue Zeit haben, da sich die Daten langsam bewegen, aber es hilft, die Ausführungszeit von Muninknoten so gering wie möglich zu halten, indem nicht auf Webseiten gewartet werden muss. (Das Plugin speichert die Seite außerdem für 30 Minuten im Cache, um unnötige Treffer zu vermeiden, es muss jedoch alle 5 Minuten eine Datenbank aktualisiert werden.)

Beachten Sie, dass \% - cron% für "\ n" ersetzt. Dies ist nützlich, wenn Sie den E-Mail-Text in einer Zeile halten.

Wenn Sie die Webseiten zwischenspeichern, erhalten Sie nicht notwendigerweise genaue Ladeergebnisse warren vor 12 Jahren 0
Ja, ich weiß - "Daten bewegen sich langsam" - das Plugin erhält Wechselkurse von einer Website, und ich möchte nicht verboten werden. (Ich bin kein Trader, aber ich habe viel Zeit damit verbracht, Munin-Graphen zu betrachten.) Ich habe ein ähnliches Plugin für lokales Wetter gemacht. Endlose Anwendungen! Andy Lee Robinson vor 12 Jahren 1
Aha! .. sehr cooler Ansatz :) warren vor 12 Jahren 1
12
mas

athat eine einfachere Schnittstelle für diese Art von Zweck, wenn atinstalliert ist, die Maschine läuft atdund der Benutzer den Befehl verwenden darf.

Zum Beispiel (überprüfen Sie die genaue Syntax mit man atoder info at),

at -f Datei now + 53 minutes

oder

at -f Datei now + 2 hours

führt die Befehle in der angegebenen Datei innerhalb von 53 Minuten bzw. 2 Stunden aus.

at kann dann zu Beginn des geplanten Jobs mit geeigneten Start-, Zähl- und Zeiteinheiten (zufällig oder anderweitig) erneut ausgeführt werden.

Bearbeiten

Wie Arjan unten auf hilfreiche Weise hinweist, müssen Sie, wenn Sie dies für eine andere als eine Spielzeuganwendung verwenden, über Fragen nachdenken, wie z

  1. wenn der nächste Durchgang beginnt, bevor der vorherige beendet ist (z. B. ist das Skript erneut eintritt?) oder

  2. wenn ein Lauf nicht korrekt abgeschlossen wird oder

  3. wenn der nächste Durchlauf nicht oder nicht rechtzeitig startet (z. B. was passiert, wenn die Maschine ausgeschaltet ist, wenn der nächste Durchlauf startet) und und

  4. über das Protokollieren und Melden fehlgeschlagener oder erfolgreicher Läufe.

das ist ein Ansatz, den ich nicht in Betracht gezogen hatte - und könnte rekursiv gemacht werden, wenn `file` den nächsten` at`-Lauf enthält, richtig? warren vor 15 Jahren 0
super - habe es gerade ausprobiert und funktioniert super :) warren vor 15 Jahren 0
+1, aber ein paar Dinge, die zu beachten sind: Wenn der `at`-Befehl die erste Zeile ist und das Skript längere Zeit ausgeführt wird (oder wenn die Intervalle kurz sind), sollten Sie mehrere Instanzen gleichzeitig ausführen. Wenn sich jedoch bei der letzten Zeile des Skripts "at" befindet, erfolgt offensichtlich keine Neuplanung, falls das Skript fehlschlägt. Wenn Sie das Skript über die Befehlszeile ausführen, wird es auch selbst (neu) geplant (und: mehrere Zeitpläne könnten dann gleichzeitig vorhanden sein). Und "cron" unterstützt das Versenden von Fehlern (oder: Ausgabe allgemein) per E-Mail. Ich weiß nicht, ob "at" auch so etwas hat? Arjan vor 15 Jahren 2
@Arjan - Ich mache mir keine Sorgen darüber, dass es fehlschlägt, und schickt mir keine E-Mail. Seitdem (zu diesem Zeitpunkt) benutze ich es nur, um auf meiner Workstation Spaß zu haben :) :) Wie auch immer - das * IST * etwas zu Denken Sie darüber nach, ob dies zu einer zufälligen Überprüfung auf Eindringen erweitert werden würde warren vor 15 Jahren 0
Das Skript, das ich mir vorstelle, ist egal, wie viele Kopien auf einmal laufen warren vor 15 Jahren 0
6
John T

Intern cronglaube ich nicht, dass eine solche Funktion existiert. Ich denke, die beste Lösung wäre, Ihren Befehl in ein Shellskript einzufügen und ein zufälliges sleepIntervall oben im Skript anzuordnen und die $RANDOMVariable zu verwenden. Führen Sie das Skript dann einmal täglich in einem normalen Cron-Job aus.

#!/bin/bash sleep $(($RANDOM%5)) /path/to/command -param1 -param2 
sleep () ist fast eine Garantie dafür, dass es vom Diensteanbieter beendet wird. Es sei denn, er ist der Dienstleister. A Dwarf vor 15 Jahren 1
Ich nahm an, dass es auf seiner eigenen Linux-Maschine war oder etwas, wenn er jemandem zufällig das Glück verleiht John T vor 15 Jahren 1
Nun, das stimmt. A Dwarf vor 15 Jahren 0
Warum ist Schlaf eine schlechte Idee? Nur Fragen... Tadeusz A. Kadłubowski vor 15 Jahren 0
klärte die Frage für @John T warren vor 15 Jahren 0
6
A Dwarf

Es hängt davon ab, auf welche Art von Intervall Sie sich befinden. Nehmen wir jedoch an, Sie möchten, dass das Skript mit einer Wahrscheinlichkeit von 1:30 (alle 30 Minuten) zufällig ausgeführt wird.

  • Erstellen Sie Ihr Cron-Skript für eine Dauer von beispielsweise 10 Minuten. Es wird dreimal alle 30 Minuten ausgelöst.

  • Verwenden Sie innerhalb des Skripts rand als Bedingung für eine if- Anweisung. Sie möchten, dass rand eine Zahl zwischen 0 und 2 zurückgibt. Wenn es 0 ist, führen Sie den Inhalt der if-Anweisung aus.

Im Wesentlichen wird Ihr Skript immer in einem festgelegten Intervall ausgelöst. Führt den Befehl jedoch nur zufällig aus. Ihr Dienstanbieter wird es Ihnen danken.

@Ein Zwerg - Danke auch für diese Idee - dies wäre ein etwas nützlicherer Weg, wenn ich auf häufige, aber quasi-zufällige Weise nach Eindringlingen usw. suchen wollte warren vor 15 Jahren 0