it-swarm.com.de

Kann ich häufiger als jede Minute einen Cron-Job ausführen?

Ist es möglich, alle 30 Sekunden einen Cron-Job ohne einen Schlafbefehl auszuführen?

48
user15336

Wenn Ihre Aufgabe so häufig ausgeführt werden muss, ist cron das falsche Werkzeug. Abgesehen von der Tatsache, dass Jobs einfach nicht so häufig gestartet werden, riskieren Sie auch einige schwerwiegende Probleme, wenn die Ausführung des Jobs länger dauert als das Intervall zwischen den Starts. Schreiben Sie Ihre Aufgabe neu, um sie zu dämonisieren und dauerhaft auszuführen, und starten Sie sie dann bei Bedarf von cron aus (und stellen Sie dabei sicher, dass sie nicht neu gestartet wird, wenn sie bereits ausgeführt wird).

38

Kandidat für den kreativsten Missbrauch eines Linux-Befehls:

Nohup watch -n 30 --precise yourprog >/dev/null &

Wenn yourprog besteht aus:

date +%M.%S.%N >> yourprog.out

dann könnte yourprog.out folgendermaßen aussehen:

50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676

dies zeigt ein ziemlich gutes Maß an Präzision.

Hier ist eine Erklärung der Teile des Befehls:

  • Nohup - Dies verhindert, dass der darauf folgende Befehl, in diesem Fall watch, beim Beenden des Terminals beendet wird.
  • watch - Dieses Programm führt wiederholt einen Befehl aus. Normalerweise wird jedes Mal, wenn watch den Befehl ausführt, der erste Bildschirm mit der Ausgabe des Befehls angezeigt.
  • -n 30 - Das Intervall, in dem der Befehl ausgeführt werden soll. In diesem Fall ist es alle dreißig Sekunden.
  • --precise - Ohne diese Option führt watch den Befehl nach Intervall Sekunden aus . Damit beginnt jeder Start des Befehls - auf dem Intervall, wenn möglich. Wenn diese Option im Beispiel nicht angegeben würde, würden die Zeiten aufgrund der Zeit, die zum Starten und Ausführen des Befehls (yourprog) benötigt wird, jedes Mal um mehr als 30 Sekunden später und später.
  • yourprog - Das Programm oder die Befehlszeile, die watch ausführen soll. Wenn die Befehlszeile spezielle Zeichen für die Shell enthält (z. B. Leerzeichen oder Semikolon), muss sie in Anführungszeichen gesetzt werden.
  • >/dev/null - Der Größer als leitet die Ausgabe des von watch ausgeführten Befehls in eine Datei um, /dev/null. Diese Datei verwirft alle darauf geschriebenen Daten. Dies verhindert, dass die Ausgabe auf den Bildschirm geschrieben wird, oder verhindert, dass _ an die Datei Nohup.out Gesendet wird, da Nohup verwendet wird.
  • & - Der Befehl watch wird im Hintergrund ausgeführt und die Steuerung wird an das Terminal oder den übergeordneten Prozess zurückgegeben.

Beachten Sie, dass Nohup, die Umleitung der Ausgabe und der Hintergrundsteuerungsoperator & Nicht spezifisch für watch sind.

Hier ist eine Erklärung des Beispielskripts yourprog:

  • date - Gibt das aktuelle Datum und/oder die aktuelle Uhrzeit aus. Es kann sie auch einstellen.
  • +%M.%S.%N - Gibt das Ausgabeformat für date an. %M Ist die aktuelle Minute, %S Ist die aktuelle Sekunde und %N Ist die aktuelle Nanosekunde.
  • >> yourprog.out - Hiermit wird die Ausgabe des Befehls date in eine Datei mit dem Namen yourprog.out Umgeleitet. Das doppelte Größer-als bewirkt, dass die Ausgabe bei jedem Aufruf an die Datei angehängt wird und nicht der vorherige Inhalt überschrieben wird.

Bearbeiten :

Möglicherweise ist eine andere Sache, die missbraucht werden könnte (oder vielleicht eine legitime Verwendung ist), systemd Timer.

Siehe systemd/Timer als Cron-Ersatz und Cron vs systemd-Timer .

Ich werde versuchen, bald ein Beispiel zu veröffentlichen.

Cron ist so konzipiert, dass es jede Minute aufwacht, daher ist es nicht möglich, es ohne Hacking zu tun, zum Beispiel Schlaf, wie Sie es erwähnt haben.

14
Balázs Pozsár
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program

Vergessen Sie nicht, etwas in Ihr Programm zu schreiben, damit es beendet wird, wenn bereits eine vorherige Instanz ausgeführt wird.

#!/bin/sh

if ln -s "pid=$$" /var/pid/myscript.pid; then
  trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
  echo "Already running, or stale lockfile." >&2
  exit 1
fi

Dies lässt natürlich immer noch eine sehr geringe Fehlermöglichkeit. Suchen Sie daher bei Google nach einer besseren Lösung für Ihre Umgebung.

13
ghoti

Sie können dies mit Software von Drittanbietern tun.

Eine Option, die für mich gut funktioniert hat, ist frequent-cron

Es ermöglicht eine Millisekundengenauigkeit und bietet Ihnen die Möglichkeit, die nächste Ausführung zu verschieben, bis die aktuelle beendet ist.

8
thatjuan

Ich hätte ein paar Bedenken:

(1) Manchmal ist ein System ausgelastet und kann die Dinge nicht genau an der 30-Sekunden-Stelle starten. Dann ist es möglich, dass zur gleichen Zeit, in der Sie einen Job ausführen, ein anderer Job erscheint und Sie dann zwei (oder mehr) Jobs haben, die dasselbe tun Ding. Abhängig vom Skript kann es hier zu erheblichen Störungen kommen. Daher sollte die Codierung in einem solchen Skript Code enthalten, um sicherzustellen, dass nur eine Instanz des angegebenen Skripts gleichzeitig ausgeführt wird.

(2) Das Skript kann möglicherweise viel Overhead verursachen und mehr Systemressourcen verbrauchen, als Sie möglicherweise möchten. Dies gilt, wenn Sie gegen viele andere Systemaktivitäten antreten.

Wie ein Poster es ausdrückte, würde ich in diesem Fall ernsthaft in Betracht ziehen, einen Daemon einzurichten, der mit zusätzlichen Prozessen ausgeführt wird, um sicherzustellen, dass er weiterhin ausgeführt wird, wenn er für Ihren Betrieb von entscheidender Bedeutung ist.

2
mdpc

meine einfachste und beliebteste Lösung für diese Aufgabe:

cron-Eintrag:
* * * * * flock -w0 /path/to/script /path/to/script

skript:
while true;do echo doing something; sleep 10s;done

faule Alternative: :)

* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log

oder

* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script

profis

  • durch die Verwendung des Befehls flock wird vermieden, dass das Skript von mehreren Instanzen gleichzeitig ausgeführt wird. Dies kann in den meisten Fällen sehr wichtig sein.
  • Die Befehle flock und watch sind bei den meisten Linux-Installationen verfügbar

nachteile

  • das Stoppen dieser Art von "Service" erfordert zwei Schritte
    • kommentieren Sie den Cron-Eintrag aus
    • beenden Sie das Skript oder den Befehl watch
1
asvany

Eine Lösung, wenn es sich um ein eigenes Skript handelt oder wenn Sie es einpacken können:

  1. Holen Sie sich und erinnern Sie sich an die Startzeit.
  2. Wenn eine Sperrdatei vorhanden ist, die Sie später berühren werden, und das Skript 60 Sekunden lang nicht ausgeführt wurde, warten Sie eine Sekunde und überprüfen Sie es erneut. (z. B. während/schlafen) *
  3. Wenn die Sperrdatei nach Ablauf von 60 Sekunden immer noch vorhanden ist, beenden Sie sie mit einer veralteten Sperrwarnung.
  4. Berühren Sie Sperrdatei.
  5. Während das Skript 60 Sekunden lang nicht ausgeführt wurde, wiederholen Sie Ihre eigentliche Aufgabe mit der gewünschten Schlafdauer.
  6. Sperrdatei löschen.
  7. Fügen Sie als minutiös cron hinzu.
  8. Bob ist Dein Onkel.

Weniger Kopfschmerzen als das Erstellen und Überwachen eines Daemons.

* Wenn Sie PHP verwenden, denken Sie an clearstatcache ().

0
Someone