Ist es möglich, alle 30 Sekunden einen Cron-Job ohne Sleep-Befehl auszuführen?
Ist es möglich, alle 30 Sekunden einen Cron-Job ohne Sleep-Befehl auszuführen?
Antworten:
Wenn Ihre Aufgabe so häufig ausgeführt werden muss, ist cron das falsche Tool. 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 erneut gestartet wird, wenn sie bereits ausgeführt wird).
run-one
damit sicherstellen, dass ein Programm / sogar ein PHP-Skript keine doppelte Instanz startet. sudo apt-get install run-one
und nenne es byrun-one <normal command>
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 yourprog.out
könnte es so 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
- Dadurch wird verhindert, dass der darauf folgende Befehl watch
beim Beenden des Terminals beendet wird.watch
- Dieses Programm führt einen Befehl wiederholt aus. Normalerweise wird jedes Mal, wenn der Befehl ausgeführt wird, der erste Bildschirm mit der Ausgabe des Befehls angezeigt watch
.-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 wird watch
der Befehl nach Intervallsekunden ausgeführt . Damit beginnt, wenn möglich , jeder Start des Befehls in dem Intervall. Wenn diese Option im Beispiel nicht angegeben wurde, werden die Zeiten aufgrund der zum Starten und Ausführen des Befehls ( yourprog
) erforderlichen Zeit immer später um mehr als 30 Sekunden erhöht .yourprog
- Das watch
auszuführende Programm oder die auszuführende Befehlszeile . 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 Wert größer als leitet die Ausgabe des Befehls, der von ausgeführt wird, watch
in eine Datei um /dev/null
. Diese Datei löscht alle darauf geschriebenen Daten. Auf diese Weise wird verhindert, dass die Ausgabe auf den Bildschirm geschrieben oder, da nohup
sie verwendet wird, an eine aufgerufene Datei gesendet wird nohup.out
.&
- Der watch
Befehl 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 sind watch
.
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
- Dies gibt das Ausgabeformat date
an, das verwendet werden soll. %M
ist die aktuelle Minute, %S
ist die aktuelle Sekunde und %N
ist die aktuelle Nanosekunde.>> yourprog.out
- Dadurch wird die Ausgabe des date
Befehls in eine aufgerufene Datei umgeleitet yourprog.out
. Das Doppelte größer als bewirkt, dass die Ausgabe bei jedem Aufruf an die Datei angehängt wird, anstatt dass der vorherige Inhalt überschrieben wird.Bearbeiten :
Möglicherweise könnten auch System-Timer missbraucht werden (oder es ist eine legitime Verwendung).
Siehe systemd / Timer als Cron-Ersatz und Cron-gegen-Systemd-Timer .
Ich werde versuchen, bald ein Beispiel zu veröffentlichen.
&
bewirkt , dass der Befehl im Hintergrund laufen zu lassen, prompt sofort die Kontrolle an den Befehl zurückkehrt. Die Verwendung des nohup
Befehls bewirkt, dass der Hintergrundprozess (in diesem Fall watch
) das Aufhängesignal ignoriert, das gesendet wird, wenn die Shell beendet wird, z. B. wenn Sie das Terminal schließen. ...
>/dev/null
bewirkt , dass die Ausgabe verworfen wird, und verhindert, dass eine nohup.out
Datei erstellt wird, die andernfalls erstellt würde, wenn die Standardausgabe ein Terminal ist.
sleep
möchten, müssen Sie eine Schleife schreiben, damit sich der Vorgang wiederholt ( watch
wird dies für Sie ebenso wiederholt cron
). Du würdest noch nohup
und brauchen &
. Ein zusätzliches Problem sleep
wäre die Zeitverschiebung. Die --precise
Option von watch
vermeidet dies. Ohne oder bei Verwendung sleep
in einer Schleife wird dem Zeitintervall die Zeit hinzugefügt, die für die Ausführung der Befehle oder des Skripts erforderlich ist, damit jeder Lauf später und später als der ...
Cron ist so konzipiert, dass es in jeder Minute aufwacht. Daher ist es nicht möglich, es ohne Hacking zu tun, zum Beispiel mit dem von Ihnen erwähnten Schlaf.
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
Vergessen Sie nicht, etwas in Ihr Programm zu schreiben, damit es beendet wird, wenn bereits eine frühere 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 kleine Chance für ein Scheitern. Suchen Sie daher bei Google nach einer besseren Lösung für Ihre Umgebung.
without a sleep command
Sie können dies mit Software von Drittanbietern tun.
Eine Option, die für mich gut funktioniert hat, ist frequent-cron
Es erlaubt Millisekundengenauigkeit und gibt Ihnen die Möglichkeit, die nächste Ausführung aufzuschieben, bis die aktuelle beendet ist.
Ich hätte ein paar Bedenken:
(1) Manchmal ist ein System ausgelastet und kann die Dinge nicht genau zum 30-Sekunden-Zeitpunkt starten. Es ist dann möglich, dass zur gleichen Zeit, in der Sie einen Job ausführen, ein anderer Job auftaucht und dann 2 (oder mehr) Jobs dasselbe tun Ding. Je nach 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 Aufwand verursachen und mehr Systemressourcen verbrauchen, als Sie möchten. Dies ist der Fall, wenn Sie gegen viele andere Systemaktivitäten antreten.
In diesem Fall würde ich ernsthaft in Erwägung ziehen, einen Daemon mit zusätzlichen Prozessen einzurichten, um sicherzustellen, dass er weiterhin ausgeführt wird, wenn er für Ihren Betrieb von entscheidender Bedeutung ist.
Cron-Eintrag:
* * * * * flock -w0 /path/to/script /path/to/script
Skript:
while true;do echo doing something; sleep 10s;done
* * * * * 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
flock
Befehls wird vermieden, dass das Skript von mehreren Instanzen gleichzeitig ausgeführt wird. Dies kann in den meisten Fällen sehr wichtig sein.flock
und watch
-Befehle sind bei den meisten Linux-Installationen verfügbarwatch
BefehlEine Lösung, wenn es für Ihr eigenes Skript ist oder wenn Sie es umbrechen können:
Weniger Kopfschmerzen als das Erstellen und Überwachen eines Daemons.
* Wenn Sie PHP verwenden, merken Sie sich clearstatcache ().