it-swarm-eu.dev

Wie führe ich Skripte alle 5 Sekunden aus?

Ich habe ein Skript, das alle fünf Sekunden ausgeführt werden muss. Ich weiß, dass cron Aufgaben pro Minute erledigen kann, aber gibt es eine Möglichkeit, jede Sekunde etwas auszuführen?

65
myusuf3

Cron lässt nur mindestens eine Minute zu. Was Sie könnten tun, ist, ein Shell-Skript mit einer Endlosschleife zu schreiben, die Ihre Aufgabe ausführt und dann 5 Sekunden lang ruht. Auf diese Weise wird Ihre Aufgabe mehr oder weniger alle 5 Sekunden ausgeführt, je nachdem, wie lange die Aufgabe selbst dauert.

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

Sie können eine my-task.sh -Datei mit dem obigen Inhalt erstellen und mit sh my-task.sh ausführen. Optional können Sie es mit supervisor als Dienst konfigurieren, damit es beim Systemstart usw. gestartet wird.

Es hört sich wirklich so an, als würden Sie etwas tun, was Sie wahrscheinlich nicht tun sollten. Dies fühlt sich falsch an .

64
Tommy Brunn

Sie könnten jede Minute ein Skript mit einem cron Job starten lassen, das 12 Prozesse im Hintergrund startet:

* * * * * ~/dostuff.sh

dostuff.sh:

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

Meine Frage ist jedoch Was auf der ERDE könnte man tun, dass alle 5 Sekunden ausgeführt werden muss?

35
warren

Benutze einfach eine Schleife:

while true ; do ./your-script & sleep 5; done

Dadurch wird Ihr Skript als Hintergrundjob gestartet, 5 Sekunden lang in den Ruhezustand versetzt und dann erneut wiederholt. Sie können Strg-C verwenden, um den Vorgang abzubrechen, oder eine andere Bedingung anstelle von true verwenden, z. ! test -f /tmp/stop-my-script wird nur wiederholt, solange die Datei /tmp/stop-my-script nicht existiert.

27
blueyed

Sie könnten das GNU -Paket mcron verwenden, eine "Vixie cron" -Alternative.

http://www.gnu.org/software/mcron/manual/mcron.html#Top

"Kann es leicht ermöglichen, feinere Zeitpunkte, d. H. Sekunden, anzugeben. Im Prinzip könnte dies auf Mikrosekunden ausgedehnt werden, dies ist jedoch nicht implementiert."

10
David

Verwenden Sie Kakteen, um Router und Switch zu überwachen, aber Cron lässt nur mindestens eine Minute zu. Wenn also ein Port/Gerät ausfällt, erfolgt erst nach zwei Minuten eine Warnung.

2
qttty

Die minimale Konfiguration in Cron ist Minuten, Sie können sie nicht für 5 Sekunden einstellen. Sie könnten Quarz verwenden, der Sekunden erlaubt. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html

2
Cody Harlow

Sie können eine SystemD-Timereinheit verwenden, die alle 5 Sekunden einen Dienst auslöst, den Sie so einrichten, dass er das tut, was Sie möchten.

Angenommen, Ihre Serviceeinheit heißt mystuff.service und ist in /etc/systemd/system installiert (siehe SystemD-Benutzerdienste Wenn Sie die Crontab eines Benutzers ersetzen möchten), können Sie eine Zeitgebereinheit schreiben So führen Sie den Dienst beim Systemstart und anschließend alle 5 Sekunden aus:

/etc/systemd/system/mystuff.timer

[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target

Laden Sie dann die Systemd-Konfiguration neu, aktivieren Sie die Zeitgebereinheit und starten Sie sie.

2
Guss

Ich habe so etwas sehr erfolgreich gemacht (und das Endresultat läuft über Wochen, bis die Maschine neu gestartet wird). Was ich gerade gemacht habe: Informationen aktualisieren und in den Cache stellen - Aktualisierung alle 10 Sekunden.

#!/bin/sh

SLEEP=5

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# echo and restart...
exec $0

Der Befehl 'exec $ 0' startet das Skript neu, ersetzt jedoch das ausgeführte Skript. Es kann anfänglich mit einer crontab '@reboot' Zeile gestartet werden.

1
Alister Bulman