Doppeltes Ausführen von Cronjobs zur selben Zeit verhindern

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Doppeltes Ausführen von Cronjobs zur selben Zeit verhindern

    Hallo,

    ich habe einen Cronjob der viel Arbeit zu erledigen hat.
    Der Cronjob wird jede Minute auf dem Server ausgeführt, er prüft ob etwas zu bearbeiten ist.

    Wenn er jedoch einmal läuft, läuft er mindestens 1 Minute oder länger, somit würde ja 1 Minute darauf der Cronjob schon wieder beginnen und so könnte es passieren das synchron Datensätze doppelt bearbeitet werden, was keinesfalls passieren darf.

    Es gäbe folgende Möglichkeit: Ich trag beim Starten des Cronjobs in eine Tabelle ein das er arbeitet, und sobald er fertig ist setzt er diesen Wert wieder auf 0. Beim Start des Scriptes wird geprüft ob bereits der Cronjob läuft oder nicht.

    Doch was wenn der Cronjob aufgrund z.B. zu langer Laufzeit abbricht? Dann würde er sich ja selbst nicht mehr ausführen, weil der Wert nicht mehr auf 0 gesetzt wurde.

    Oder gibt es die Möglichkeit per PHP abzufragen, ob ein Script gerade läuft oder nicht?

    Danke,

    Chris

  • #2
    Was genau macht dein CronJob da selber?
    Oder führt er nur jede Minute eine PHP Datei aus?

    Kommentar


    • #3
      @da_chris
      deine idee mit dem flag in der db oder auch einer textdatei ist ganz gut.

      wie du korrekt erkannt hast, kann es sein, dass das flag immer noch auf 1 stehen kann, wenn dein script abgebrochen wurde. um zu verhindern, dass das script aufgrund dessen gar nicht mehr starten kann, solltest du eine art zeitprüfung einbinden. du weisst sicherlich am besten wie lange so ein script maximal laufen wird. daher kannst du sagen, dass wenn das flag nach z.b. 10 minuten immer noch auf 1 steht, kann etwas nicht stimmen und dein script läuft damit dennoch.
      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


      Kommentar


      • #4
        Hi,

        nun, der Cronjob sendet XML-Ausgaben (bis zu 100.000 Stück) an einen fremden Server.

        Das mit der Zeitprüfung ist auch eine gute Idee, daran hab ich auch schon gedacht. Das Problem ist nur das so eine Arbeit so schnell wie nur möglich verarbeitet werden muss, da kann ich mir z.B. 5 Minuten Leerlauf nicht erlauben.

        Gibt es noch eine andere Möglichkeit, an die ich vielleicht nicht gedacht habe? Kann ich vielleicht mit einem anderen Cronjob über das System prüfen ob der andere Cron noch aktiv ist?

        Chris

        Kommentar


        • #5
          Kleiner Gedankenanstoss:
          Die Prozessliste auf dein Skript prüfen.
          Etwa so ausm Kopf ohne Gewähr
          Code:
          $var = ps - ef|grep 'progname'
          if [ $var = "xxx" ]; then
          führe Script aus
          else
          mach nix
          fi
          so in etwa würd ich das als Shell-Skript machen. Bei dem grep musste natürlich noch mit awk oder cut arbeiten um nur den Namen zu bekommen.
          Ich kenn mich jetzt nicht so mit PHP aus - bin erst bei den Anfängen - aber es gibt da doch auch exec, damit kannste sowas doch vielleicht machen. Ansonsten wie dein letzter Vorschlag, Shell-skript als cronjob, dass dann wenn es nicht mehr läuft, das php-Skript aufruft

          slurpee

          Zuletzt geändert von slurpee; 16.02.2006, 16:34.

          Kommentar


          • #6
            ja, ich denke exec ist das richtige...

            werde mich damit mal auseinandersetzen, habe da aber auch schon nette Funktionen zum Prüfen & Killen von Prozessen gefunden:

            http://at2.php.net/manual/de/function.exec.php

            danke für die Tipps!

            Kommentar

            Lädt...
            X