Ich habe einige Lösungen gesehen, darunter das Beobachten und einfache Ausführen eines Schleifenskripts (und eines Schlafskripts) im Hintergrund, aber nichts war ideal.
Ich habe ein Skript, das alle 15 Sekunden ausgeführt werden muss, und da cron keine Sekunden unterstützt, muss ich etwas anderes herausfinden.
Was ist die robusteste und effizienteste Methode, um unter Unix alle 15 Sekunden ein Skript auszuführen? Das Skript muss auch nach einem Neustart ausgeführt werden.
Antworten:
Ich würde cron verwenden, um jede Minute ein Skript auszuführen, und dieses Skript dazu bringen, Ihr Skript viermal mit einem Ruhezustand von 15 Sekunden zwischen den Läufen auszuführen.
(Dies setzt voraus, dass Ihr Skript schnell ausgeführt wird. Wenn nicht, können Sie die Ruhezeiten anpassen.)
Auf diese Weise erhalten Sie alle Vorteile
cron
sowie Ihre Laufzeit von 15 Sekunden.Bearbeiten: Siehe auch den Kommentar von @ bmb unten.
quelle
Wenn Sie darauf bestehen, Ihr Skript von cron aus auszuführen:
und ersetzen Sie Ihren Skriptnamen und den Pfad zu / foo / bar / your_script
quelle
* * * * * sleep 15; php /foo/bar/your_script
#!/usr/bin/php
Sie ein PHP-Skript ausführen, können Sie die Zeile an die Spitze Ihres PHP-Skripts stellen und es ausführbar machenGeänderte Version der oben genannten:
zu / etc / crontab hinzufügen:
quelle
Wird dies nicht im Hintergrund ausgeführt?
Dies ist ungefähr so effizient wie es nur geht. Der wichtige Teil wird nur alle 15 Sekunden ausgeführt und das Skript schläft den Rest der Zeit (wodurch keine Zyklen verschwendet werden).
quelle
&
am Ende von Zeile 3 nicht hinzufügen . Auf jeden Fall wird dies nicht alle 15 Sekunden ausgeführt. Dies läuft alle "15 Sekunden + wie lange esecho hello
dauert". Welches könnte 0,01 Sekunden sein; könnte 19 Stunden sein.Ich habe einen Scheduler schneller als Cron geschrieben. Ich habe auch einen überlappenden Schutz implementiert. Sie können den Scheduler so konfigurieren, dass kein neuer Prozess gestartet wird, wenn der vorherige noch ausgeführt wird. Schauen Sie sich https://github.com/sioux1977/scheduler/wiki an
quelle
Verwenden Sie Nanosleep (2) . Es verwendet eine Struktur
timespec
, mit der Zeitintervalle mit Nanosekundengenauigkeit festgelegt werden.quelle
quelle
Seit meiner vorherigen Antwort habe ich eine andere Lösung gefunden, die anders und vielleicht besser ist. Mit diesem Code können Prozesse mehr als 60 Mal pro Minute mit einer Genauigkeit von Mikrosekunden ausgeführt werden. Sie benötigen das usleep-Programm, damit dies funktioniert. Sollte bis zu 50 Mal pro Sekunde gut sein.
quelle
Verwenden Sie einen in diesem Thread beschriebenen Sperrmechanismus, um mögliche Überschneidungen bei der Ausführung zu vermeiden .
quelle