Lösung 1:
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 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
was auf eine ziemlich gute Genauigkeit hinweist.
Hier ist eine Erklärung der Teile des Befehls:
nohup
- Dies behält den folgenden Befehl bei,watch
in diesem Fall vom Beenden, wenn das Terminal beendet wird.watch
- Dieses Programm führt einen Befehl wiederholt aus. Normalerweise wird der erste Bildschirm der Ausgabe des Befehls jedes Mal angezeigtwatch
führt den Befehl aus.-n 30
- Das Intervall, in dem der Befehl ausgeführt werden soll. In diesem Fall alle dreißig Sekunden.--precise
- Ohne diese Optionwatch
führt den Befehl after aus Intervall Sekunden. Damit beginnt jeder Start des Befehls ein Intervall wenn möglich. Wenn diese Option im Beispiel nicht angegeben wäre, würden die Zeiten aufgrund der Zeit, die zum Starten und Ausführen des Befehls benötigt wird, jedes Mal um mehr als 30 Sekunden später (yourprog
).yourprog
- Das Programm oder die Befehlszeile fürwatch
ausführen. Wenn die Befehlszeile Sonderzeichen der Shell enthält (z. B. Leerzeichen oder Semikolon), muss sie in Anführungszeichen gesetzt werden.>/dev/null
- Das Größer-als leitet die Ausgabe des Befehls um, der vonwatch
ausgeführt wird in eine Datei,/dev/null
. Diese Datei verwirft alle in sie geschriebenen Daten. Dies verhindert, dass die Ausgabe auf den Bildschirm geschrieben wird oder seitnohup
verwendet wird, verhindert es, dass die Ausgabe an eine Datei namensnohup.out
gesendet wird .&
- Diewatch
Der Befehl wird im Hintergrund ausgeführt und die Kontrolle wird an das Terminal oder den übergeordneten Prozess zurückgegeben.
Beachten Sie, dass nohup
, die Umleitung der Ausgabe und die &
Hintergrundsteuerungsoperatoren sind nicht spezifisch für watch
.
Hier ist eine Erläuterung des Beispiels yourprog
Skript:
date
- Gibt das aktuelle Datum und/oder die Uhrzeit aus. Es kann sie auch setzen.+%M.%S.%N
- Dies gibt das Ausgabeformat fürdate
an benutzen.%M
ist die aktuelle Minute,%S
ist die aktuelle Sekunde und%N
ist die aktuelle Nanosekunde.>> yourprog.out
- Dies leitet die Ausgabe vondate
um Befehl in eine Datei namensyourprog.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 :
Eine andere Sache, die möglicherweise missbraucht werden könnte (oder vielleicht eine legitime Verwendung ist), sind systemd-Timer.
Siehe systemd/Timers als Cron-Ersatz und Cron vs systemd timers.
Ich werde versuchen, bald ein Beispiel zu posten.
Lösung 2:
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 ernsthafte Probleme, wenn die Ausführung des Jobs länger dauert als das Intervall zwischen den Starts. Schreiben Sie Ihre Aufgabe neu, um sie zu daemonisieren und dauerhaft auszuführen, und starten Sie sie dann bei Bedarf von Cron aus (während Sie sicherstellen, dass sie nicht neu gestartet wird, wenn sie bereits ausgeführt wird).
Lösung 3:
Cron ist so konzipiert, dass es jede Minute aufwacht, daher ist es nicht möglich, dies ohne Hacking zu tun, z. B. schlafen, wie Sie erwähnt haben.
Lösung 4:
* * * * * /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 läuft.
#!/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
Natürlich lässt dies immer noch eine sehr kleine Chance für Fehler, suchen Sie also bei Google nach einer besseren Lösung, die für Ihre Umgebung geeignet ist.
Lösung 5:
Sie können dies mit Software von Drittanbietern tun.
Eine Option, die für mich gut funktioniert hat, ist frequent-cron
Es ermöglicht Millisekunden-Präzision und gibt Ihnen die Möglichkeit, die nächste Ausführung aufzuschieben, bis die aktuelle beendet wurde..