Cron-Skript als Warteschlange oder eine Warteschlange für Cron?

8

Ich wette, dass jemand das bereits gelöst hat und vielleicht verwende ich die falschen Suchbegriffe für Google, um mir die Antwort zu sagen, aber hier ist meine Situation.

Ich habe ein Skript, das ich ausführen möchte, aber ich möchte es nur ausführen, wenn es geplant ist und nur eins nach dem anderen. (Das Skript kann nicht gleichzeitig ausgeführt werden)

Jetzt ist der klebrige Teil, dass ich eine Tabelle namens "myhappyschedule" habe, die die benötigten Daten und die geplante Zeit hat. Diese Tabelle kann mehrere geplante Zeiten gleichzeitig haben, jede würde dieses Skript ausführen. Also im Grunde brauche ich eine Warteschlange jedes Mal, wenn das Skript ausgelöst wird und sie alle auf jeden warten müssen, bevor es fertig ist. (Dies kann manchmal nur eine Minute dauern, bis das Skript seine vielen Minuten ausgeführt hat)

Ich denke daran, ein Skript zu erstellen, das myhappyschedule alle 5 min überprüft und die geplanten Termine zusammenfasst und sie in eine Warteschlange stellt, in der ein anderes Skript jeden "Job" oder jedes Vorkommen in der Warteschlange ausführen kann. Was das alles chaotisch klingt.

Um dies länger zu machen - ich sollte sagen, dass ich Benutzern erlaube Dinge in myhappydate zu planen und crontab nicht zu bearbeiten.

Was kann dagegen getan werden? Dateisperren und Skripts, die Skripte aufrufen?

    
user30413 22.10.2008, 16:02
quelle

3 Antworten

3

fügen Sie eine Spalte exec_status zu myhappytable hinzu (vielleicht auch time_started und time_finished , siehe Pseudocode)

Führen Sie das folgende Cron-Skript alle x Minuten aus

Pseudocode von Cron-Skript:

%Vor%

Auf diese Weise überprüft das Skript zunächst, ob keiner der Befehle ausgeführt wird, und führt dann den ersten noch nicht ausgeführten Befehl aus, bis im gegebenen Moment keine weiteren Befehle ausgeführt werden. Außerdem können Sie sehen, welcher Befehl ausgeführt wird, indem Sie die Datenbank abfragen.

Eine potentielle Falle: Wenn das Cron-Skript beendet wird, bleibt eine geplante Aufgabe im Zustand "executing_now". Das ist, was die PID-Sperre am Anfang und am Ende ist: um zu sehen, ob das Cron-Skript ordnungsgemäß beendet wurde. Pseudocode von create / check pidlock:

%Vor%     
Piskvor 22.10.2008, 16:49
quelle
2

Sie können den Befehl at (1) in Ihrem Skript verwenden, um den nächsten Lauf zu planen. Bevor es beendet wird, kann es myhappyschedule für die nächste Laufzeit überprüfen. Du brauchst Cron überhaupt nicht.

    
Steven Huwig 22.10.2008 16:15
quelle
0

Ich bin auf diese Frage gestoßen, als ich nach einer Lösung für das Warteschlangenproblem gesucht habe. Für alle anderen, die hier suchen, ist meine Lösung.

Kombinieren Sie dies mit einem Cron, der Jobs so startet, wie sie geplant sind (auch wenn sie zur gleichen Zeit ausgeführt werden sollen) und das das Problem, das Sie beschrieben haben, ebenfalls löst.

Problem

  • Es sollte höchstens eine Instanz des Skripts ausgeführt werden.
  • Wir möchten Anfragen so schnell wie möglich bearbeiten.

ie. Wir brauchen eine Pipeline zum Skript.

Lösung:

Erstellen Sie eine Pipeline für jedes Skript. Fertig mit einem kleinen Bash-Skript (weiter unten).

Das Skript kann als
./pipeline "<any command and arguments go here>"

aufgerufen werden

Beispiel:

%Vor%

Das Skript erstellt für jeden Befehl eine neue Named Pipe . Das obige erzeugt also benannte Pipes: sleep , shabugabu und single_instance_script

In diesem Fall startet der erste Aufruf einen Reader und führt single_instance_script mit some arguments als Argumente aus. Sobald der Anruf beendet ist, wird der Leser die nächste Anfrage aus der Pipe holen und mit some other_arguments ausführen, fertig, den nächsten usw. holen ...

Dieses Skript blockiert anfragende Prozesse, nennen Sie es also als Hintergrund-Job (& amp; am Ende) oder als freistehenden Prozess mit at ( at now <<< "./pipeline some_script" )

%Vor%     
Nick Zalutskiy 07.05.2009 20:49
quelle

Tags und Links