447 Stimmen

Alle 30 Sekunden einen Cron laufen lassen

Ok, ich habe also einen Cron, den ich alle 30 Sekunden ausführen muss.

Hier ist, was ich habe:

*/30 * * * * /bin/bash -l -c 'cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'''

Es läuft, aber läuft es alle 30 Minuten oder alle 30 Sekunden?

Außerdem habe ich gelesen, dass Cron vielleicht nicht das beste Werkzeug ist, wenn ich es so oft laufen lasse. Gibt es ein anderes besseres Tool, das ich unter Ubuntu 11.04 verwenden oder installieren kann und das eine bessere Option ist? Gibt es eine Möglichkeit, den obigen Cron zu reparieren?

2voto

bnoeafk Punkte 479

Werfen Sie einen Blick auf häufig-cron - Es ist alt, aber sehr stabil und man kann bis auf Mikrosekunden heruntergehen. Zum jetzigen Zeitpunkt ist das Einzige, was ich dagegen sagen würde, dass ich immer noch versuche, herauszufinden, wie man es außerhalb von init.d, aber als nativen systemd-Dienst installieren kann, aber bis Ubuntu 18 läuft es ganz gut, wenn man init.d verwendet (die Entfernung kann bei späteren Versionen variieren). Es hat den zusätzlichen Vorteil (?), dass es keine weitere Instanz des PHP-Skripts startet, bevor nicht ein vorheriges beendet wurde, was potenzielle Probleme mit Speicherlecks reduziert.

1voto

jfajunior Punkte 1105

Vielen Dank für die vielen guten Antworten. Um es einfach zu machen, mochte ich die gemischte Lösung, mit der Kontrolle auf crontab und der Zeiteinteilung auf dem Skript. So habe ich es gemacht, um ein Skript alle 20 Sekunden (dreimal pro Minute) auszuführen. Crontab-Zeile:

 * * * * 1-6 ./a/b/checkAgendaScript >> /home/a/b/cronlogs/checkAgenda.log

Drehbuch:

cd /home/a/b/checkAgenda

java -jar checkAgenda.jar
sleep 20
java -jar checkAgenda.jar 
sleep 20
java -jar checkAgenda.jar

0voto

Thomas Punkte 1096

Ich hatte gerade eine ähnliche Aufgabe zu erledigen und verwende den folgenden Ansatz:

nohup watch -n30 "kill -3 NODE_PID" &

Ich brauchte ein periodisches kill -3 (um den Stack-Trace eines Programms zu erhalten) alle 30 Sekunden für mehrere Stunden.

nohup ... & 

Damit soll sichergestellt werden, dass ich die Ausführung von watch nicht verliere, wenn ich die Shell verliere (Netzwerkprobleme, Windows-Absturz usw.).

-1voto

Lo Vega Punkte 91

Ausführung in einer Shell-Schleife, Beispiel:

#!/bin/sh    
counter=1
while true ; do
 echo $counter
 counter=$((counter+1))
 if [[ "$counter" -eq 60 ]]; then
  counter=0
 fi
 wget -q http://localhost/tool/heartbeat/ -O - > /dev/null 2>&1 &
 sleep 1
done

-1voto

Reeth Punkte 46

Durch Versuch und Irrtum habe ich den richtigen Ausdruck gefunden: */30 * * ? * * * Dies bedeutet alle 30 Sekunden. Referenz: https://www.freeformatter.com/cron-expression-generator-quartz.html Sie haben den Ausdruck für die Ausführung jeder Sekunde bereitgestellt: * * * ? * * * */x wird verwendet, um alle x Einheiten zu laufen. Ich habe das an der Stelle der Minute ausprobiert und viola. Ich bin sicher, dass andere das schon herausgefunden haben, aber ich wollte meinen Heureka-Moment teilen! :D

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X