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?
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/bashwhile 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 .
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:
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.
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".
"Es ist leicht möglich, feinere Zeitpunkte, dh Sekunden, anzugeben. Dies könnte im Prinzip auf Mikrosekunden ausgedehnt werden, ist jedoch nicht implementiert."
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".
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.
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 :
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?
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.
sleep 5
pausiert (vielleicht innerhalb einer Schleife) für 5 Sekunden) ...?Antworten:
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.
Sie können eine
my-task.sh
Datei mit dem obigen Inhalt erstellen und mit ausführensh my-task.sh
. Optional können Sie essupervisor
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. Das fühlt sich falsch an .
quelle
Sie könnten
cron
jede Minute ein Skript starten lassen, das 12 Hintergrundprozesse startet:dostuff.sh
:Meine Frage ist jedoch, was auf ERDE können Sie tun, das alle 5 Sekunden ausgeführt werden muss?
quelle
/media
Verzeichnis nach einem LaufwerkWhat on EARTH
- Statistiken, Speicherbereinigung, Dateisynchronisierung, Onlinestatus, Sie nennen es.Benutze einfach eine Schleife:
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-script
nur eine Schleife auszuführen, solange die Datei/tmp/stop-my-script
nicht vorhanden ist.quelle
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../your-script
im 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 nachdo
und vordone
). 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.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."
quelle
mcron
musssendmail
standardmäßig installiert und aktiviert sein. Wie kann ich es deaktivieren?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
quelle
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.
quelle
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.service
und 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
Laden Sie dann die Systemd-Konfiguration neu, aktivieren Sie die Zeitgebereinheit und starten Sie sie.
quelle
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.
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.
quelle
while
Schleife verwenden, anstatt das Skript wiederholt neu zu starten?