Hallo Leutz,
auf meinem Server läuft ein Cronjob, der alle 30 Minuten Paidmails verschickt (wenn denn welche da sind). Normalerweise dauert der Versand von 5.000 Mails 15-18 Minuten. Dann darf sich der Server ein bißchen erholen und startet dann zur nächsten halben Stunde den nächsten Versand.
Nun habe ich aber neuerdings das Problem, dass die Ausführung des Cronjobs über 30 Minuten dauert. Nicht immer, nur wenn der SQL-Server schwerst am ackern ist, aber leider passiert es doch. Und dann gibt es da die häßliche Situation, dass der erste Cronjob noch aktiv ist, der zweite bereits gestartet wurde und beide zusammen auf dieselbe Datenbank zugreifen. In der Folge werden Mails doppelt verschickt, was nicht sein soll.
Meine Frage ist nun, wie ich verhindern kann, dass zwei Cronjobs (zweimal derselbe Cronjob) gleichzeitig laufen.
Meine erste Idee war, dass ein Cronjob sich beim Start "anmeldet", indem er in der Datenbank einen Wert setzt. Und wenn er fertig ist, dann wird dieser Wert wieder gelöscht. Der nächste Cronjob fragt zunächst ab, ob ein Wert gesetzt ist, wenn ja weiß er "da läuft noch mein Vorgänger, starte ich mal erst gar nicht".
Das System hat nur den Nachteil, dass so ein Cronjob (oder der Server) ja auch mal abstürzen kann. Und wenn das passiert, wenn der Wert gerade gesetzt war, gibt es keine Funktion, die ihn wieder löschen wird. Also müsste man da die nächste Abfrage programmieren "wenn das Setzen des Wertes mehr als x Stunden her ist, dann..."
So könnte man das sicher programmieren und zum Laufen bringen. Aber ich bin mir echt nicht sicher, ob ich das nicht viel zu kompliziert angehe. Ich kann mich noch dunkel an ein paar Semester C++ unter Windows erinnern, wo uns irgendein Dozent was beigebracht hat, dass man definieren kann, dass ein Programm (Prozess) vom System nur einmal ausgeführt werden kann/darf. Läuft der Prozess/Programm (noch), kann es kein weiteres Mal gestartet werden.
Gibt es sowas unter Linux oder in php auch??? - Oder hat jemand noch eine richtig coole Idee für mich???
auf meinem Server läuft ein Cronjob, der alle 30 Minuten Paidmails verschickt (wenn denn welche da sind). Normalerweise dauert der Versand von 5.000 Mails 15-18 Minuten. Dann darf sich der Server ein bißchen erholen und startet dann zur nächsten halben Stunde den nächsten Versand.
Nun habe ich aber neuerdings das Problem, dass die Ausführung des Cronjobs über 30 Minuten dauert. Nicht immer, nur wenn der SQL-Server schwerst am ackern ist, aber leider passiert es doch. Und dann gibt es da die häßliche Situation, dass der erste Cronjob noch aktiv ist, der zweite bereits gestartet wurde und beide zusammen auf dieselbe Datenbank zugreifen. In der Folge werden Mails doppelt verschickt, was nicht sein soll.
Meine Frage ist nun, wie ich verhindern kann, dass zwei Cronjobs (zweimal derselbe Cronjob) gleichzeitig laufen.
Meine erste Idee war, dass ein Cronjob sich beim Start "anmeldet", indem er in der Datenbank einen Wert setzt. Und wenn er fertig ist, dann wird dieser Wert wieder gelöscht. Der nächste Cronjob fragt zunächst ab, ob ein Wert gesetzt ist, wenn ja weiß er "da läuft noch mein Vorgänger, starte ich mal erst gar nicht".
Das System hat nur den Nachteil, dass so ein Cronjob (oder der Server) ja auch mal abstürzen kann. Und wenn das passiert, wenn der Wert gerade gesetzt war, gibt es keine Funktion, die ihn wieder löschen wird. Also müsste man da die nächste Abfrage programmieren "wenn das Setzen des Wertes mehr als x Stunden her ist, dann..."
So könnte man das sicher programmieren und zum Laufen bringen. Aber ich bin mir echt nicht sicher, ob ich das nicht viel zu kompliziert angehe. Ich kann mich noch dunkel an ein paar Semester C++ unter Windows erinnern, wo uns irgendein Dozent was beigebracht hat, dass man definieren kann, dass ein Programm (Prozess) vom System nur einmal ausgeführt werden kann/darf. Läuft der Prozess/Programm (noch), kann es kein weiteres Mal gestartet werden.
Gibt es sowas unter Linux oder in php auch??? - Oder hat jemand noch eine richtig coole Idee für mich???
