Wie führe ich Skripte alle 5 Sekunden aus?

66

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

myusuf3
quelle
3
Welches Problem versuchen Sie zu lösen? Sind Sie sicher, dass cron die richtige Lösung ist?
Andol
1
Ich weiß, dass cron nicht die richtige Lösung ist. Ich sagte, dass es nicht in der Frage war. Bitte lesen Sie. Ich versuche, alle 5 Sekunden ein Skript auszuführen.
Myusuf3
2
Tut mir leid, ich schätze, ich habe die Frage etwas falsch verstanden. Dennoch fragen Sie sich, ob Sie versuchen, das richtige Problem zu lösen.
Andol
Für Leute, die hierher kommen und alle 5 Sekunden etwas laufen lassen wollen. Ich empfehle dringend, stattdessen zu lernen, wie man Echtzeit mit Werkzeugen wie socket.io als Beispiel programmiert.
Brandon Bertelsen
Haben Sie den Befehl zum Einschlafen der Bash entdeckt? sleep 5pausiert (vielleicht innerhalb einer Schleife) für 5 Sekunden) ...?
SDsolar

Antworten:

64

Cron lässt nur mindestens eine Minute zu. Sie können ein Shell-Skript mit einer Endlosschleife schreiben, die Ihre Aufgabe ausführt und anschließend 5 Sekunden lang in den Ruhezustand wechselt. 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.shDatei mit dem obigen Inhalt erstellen und mit ausführen sh my-task.sh. Optional können Sie es supervisorals 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. Das fühlt sich falsch an .

Tommy Brunn
quelle
Es kann erforderlich sein, dass ein Cron alle 5 oder weniger Sekunden ausgeführt wird, um in PHP-basierten Scrapern verwendet zu werden.
Ravish Kumar
Fühlt sich wirklich falsch an. Wenn Sie es in einen Cron-Job aufnehmen, haben Sie jede Minute überlappende Jobs. Nach einer Stunde werden alle 5 Sekunden 60 Jobs gestartet. Wenn Sie nicht in einen Cron-Job einbinden, wissen Sie möglicherweise nicht, wie Sie ihn stoppen oder ob er überhaupt existiert.
4.
35

Sie könnten cronjede Minute ein Skript starten lassen, das 12 Hintergrundprozesse 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 ERDE können Sie tun, das alle 5 Sekunden ausgeführt werden muss?


quelle
1
Das kam mir sehr gelegen, als ich ein Skript erstellte, das wiederholt das /mediaVerzeichnis nach einem Laufwerk
durchsucht
32
What on EARTH- Statistiken, Speicherbereinigung, Dateisynchronisierung, Onlinestatus, Sie nennen es.
RuX
3
Verweis auf externe API für zeitnahe Daten. Das Ausführen einer Anfrage alle 5 Sekunden ist VIEL besser als bei jedem Seitenaufruf.
Sergey Kudriavtsev
1
Was ist, wenn crontab die Datei dostuff.sh zweimal ausführt? Zum Beispiel wird das Skript in der 55. Sekunde ausgeführt, ist aber noch nicht fertig, aber der Cron ruft das Skript erneut auf. Was wird passieren?
TomSawyer
2
DAS IST SCHLECHT! Möglicherweise wird das Skript mehrmals gleichzeitig ausgeführt (wenn dies länger als 5 Sekunden dauert), was zu einem Race-Zustand in allen (auch temporären) Dateien führen kann, auf die zugegriffen wird. TUN SIE DAS NICHT, wenn Sie zweimal zur gleichen Zeit dasselbe tun, was zu Problemen führen könnte! (Und das wird normalerweise so sein!)
Nonny Moose
27

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 stattdessen eine andere Bedingung verwenden true, um z. B. ! test -f /tmp/stop-my-scriptnur eine Schleife auszuführen, solange die Datei /tmp/stop-my-scriptnicht vorhanden ist.

bläulich
quelle
Wenn ich das kaufmännische Und einschließe, heißt es bash: syntax error near unexpected token ';', habe ich es herausgenommen. Ich habe Bash 4.3.11. Mein Befehl wird schnell ausgeführt, sodass es in Ordnung ist, wenn er im Vordergrund ausgeführt wird.
Tyler Collier
1
@ TylerCollier Wenn Sie ./your-scriptim Hintergrund laufen mussten (während des 5-sekündigen Ruhezustands), konnten Sie das Programm behalten, &aber fallen lassen ;. Da es &dem Zweck dient, die Befehle zu trennen, ist es unnötig (und anscheinend nicht zulässig), ;danach in derselben Zeile zu stehen. Eine andere Möglichkeit besteht darin, die Schleife in mehrere Zeilen zu schreiben (mit einem Zeilenumbruch nach &und optional auch Zeilenumbrüchen nach dound vor done). Da das ;After &ein Tippfehler zu sein scheint, habe ich es entfernt. blueyed: Bitte legen Sie den ;Rücken frei, wenn Sie es wirklich wollen. wenn ja, schlage ich vor, auch eine Erklärung hinzuzufügen.
Eliah Kagan
@EliahKagan FWIW, es funktioniert auf Zsh (kein Syntaxfehler), ist aber nicht wirklich notwendig. Danke für die Bearbeitung!
bläulich
10

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

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

"Es ist leicht möglich, feinere Zeitpunkte, dh Sekunden, anzugeben. Dies könnte im Prinzip auf Mikrosekunden ausgedehnt werden, ist jedoch nicht implementiert."

David
quelle
Genau das habe ich gesucht. Danke!
SDsolar
Bitte posten Sie dies als Antwort auf meine Frage hier: askubuntu.com/questions/922216/…, damit ich Ihre Antwort akzeptieren kann.
SDsolar
mcronmuss sendmailstandardmäßig installiert und aktiviert sein. Wie kann ich es deaktivieren?
Ihsan
2

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

Cody Harlow
quelle
Es scheint, dass Quarz kein Open Source ist. Ist das richtig?
txwikinger
Es hat eine Open Source Version. Es hat keine Seite, sondern geht einfach zur Download-Seite. Sie müssen das Formular nicht ausfüllen, sondern klicken auf "Bring mich zum Download".
Cody Harlow
scheint mindestens ab 2018 Open Source zu sein. github.com/quartz-scheduler/quartz
dogmatic69
2

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.

Menge
quelle
1
Ich empfehle , diese Antwort zu bearbeiten , um sie mit spezifischen Details zu erweitern. (Siehe auch Wie schreibe ich eine gute Antwort ?, um allgemeine Hinweise zu erhalten, welche Arten von Antworten auf Ask Ubuntu als am wertvollsten erachtet werden.)
David Foerster
2

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 Service-Unit wird aufgerufen mystuff.serviceund installiert /etc/systemd/system(überprüfen Sie die SystemD-Benutzerdienste, wenn Sie die Crontab eines Benutzers ersetzen möchten), dann können Sie eine Timer-Unit schreiben, um den Service zum Startzeitpunkt und dann alle 5 Sekunden wie folgt auszuführen :

/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.

Guss
quelle
1
Es ist die beste Lösung, der einzige Nachteil ist, dass cron viel einfacher zu überblicken und zu konfigurieren ist. SystemD ist ein Schmerz und es beginnt mit seiner Verzeichnisstruktur. Immer noch das Beste für eine Pause von 5 Sekunden
John
Würde das obige Snippet nicht in /etc/systemd/system/mystuff.timer anstelle von mystuff.service abgelegt?
Brooks
@Brooks: Ja, mein schlechtes - schlechtes Kopieren & Einfügen auf meiner Seite. Fest.
Guss
Danke ... froh zu wissen, dass ich nicht verrückt bin, während ich systemd lerne :)
Brooks
1

Ich habe so etwas sehr erfolgreich gemacht (und das Endresultat läuft über Wochen, bis die Maschine neu gestartet wird). Was ich gerade tat: 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.

Alister Bulman
quelle
8
Warum nicht eine whileSchleife verwenden, anstatt das Skript wiederholt neu zu starten?
David Z