Andreas: Script einmal pro Minute aufrufen

Hallo!

Ich überlege gerade, wie ich es am elegantesten machen kann, ein und dasselbe Script über längere Zeit einmal pro Minute aufzurufen. Zum einen unter Win2K aber auch unter Unix.
In dem Script rufe ich per http einen anderen Webserver auf und trage Antwort(Status-code...) ggfs. in eine Tabelle ein und schreibe ggfs. eine email.

Leider habe ich auf dem Unix-Rechner keinen direkten Zugriff auf Cronjobs, nur über ein Webinterface, daher kann ich nur 15-Minuten-weise Cronjobs erstellen, aber auch das ist quatsch, dann bräuchte ich nämlich 96 Cronjobs(wenn ich richtig gerechnet habe).

Zur Zeit mache ich das mit einem 2. Script, zwischen dem ich per header() und sleep() immer minütlich "hin und herspinge".

Das funkrioniert zwar prima, wird aber nicht lange gut gehen befürchte ich ;-)

Was gibt es da für Tools... auf die ich da ggfs. zurückgreifen könnte, hätte da PERL bessere Möglichkeiten?

Viele Grüße
Andreas

  1. use Mosche;

    Leider habe ich auf dem Unix-Rechner keinen direkten Zugriff auf Cronjobs, nur über ein Webinterface, daher kann ich nur 15-Minuten-weise Cronjobs erstellen, aber auch das ist quatsch, dann bräuchte ich nämlich 96 Cronjobs(wenn ich richtig gerechnet habe).

    Wie wäre es, du lässt Perl für dich den Cronjob eintragen?

    use Tschoe qw(Matti);

    1. Hi!

      Wie wäre es, du lässt Perl für dich den Cronjob eintragen?

      Vermute das das nicht geht, denn ich darf für extra Cronjobs extra bezahlen ;-), aber auch wenn doch, man kann ja nur Cronjobs nur täglich ausführen, oder ist das eine Beschränkung durch meinen Provider? Denn in dem Falle hieße es 1440 Cronjobs die ich bräuchte, und das kann es ja nicht sein.
      Auf der anderen Seite, meine header-weiterleitungsschleife läuft gleich 2 Stunden, aber ich sehe das als Versuch, der Provider wird das nicht mögen, wobei ich nicht wirklich viele Recourcen verschwende, da gibt es schlimmeres!

      Grüße
      Andreas

      1. Hallo Andreas,

        Auf der anderen Seite, meine header-weiterleitungsschleife läuft gleich 2 Stunden, aber ich sehe das als Versuch, der Provider wird das nicht mögen, wobei ich nicht wirklich viele Recourcen verschwende, da gibt es schlimmeres!

        Mich würde interessieren, wie Du die Ping-Pong-Schleife wieder stoppen kannst? Hast Du Netz und doppelten Boden eingebaut?

        Gruß

        Tom

        1. Hi!

          Mich würde interessieren, wie Du die Ping-Pong-Schleife wieder stoppen kannst? Hast Du Netz und doppelten Boden eingebaut?

          Habe ich zur Zeit nicht implementiert, da ich es nur vom Browser aufrufe, kann ich das einfach mit der "stopp" Taste im Browser, dem Vrowser wird nach einer Minute (sleep(60)) ein Header gesendet, also geht ein Request an das 2. Script, das gibt wieder einen header und zurück...
          Zum Unterbrechen könnte ich zur Not auch eines der beiden Script umbenennen...
          Zur Zeit tendiere ich dazu, das Script auf 24 Stunden Laufzeit zu begrenzen, also immer die Startzeit mitschleppen, und nach 86400 Sekunden nicht mehr header() ausführen. Dann rufe ich es täglich von einem Cronjob auf.
          Besser wäre es mit 24 Cronjobs stündlich, aber wie gesagt darf ich für jeden Cronjob extra zahlen ;-)
          Aber zufrieden bin ich damit nicht, vor allem ist das sehr viel unstabiler als die meisten Webserver, wodurch ein echtes Monitoring(eines anderen Servers) eigentlich schwachsinnig ist, naja.

          Aber was meinst Du mit "Netz mit doppeltem Boden"? Hast Du ne bessere Idee? Problem ist, das ich die Status-Codes ermitteln will, und darauf reagieren, also sofort eine Warn-mail verschicken...

          Viele Grüße
          Andreas

          1. use Mosche;

            Mich würde interessieren, wie Du die Ping-Pong-Schleife wieder stoppen kannst? Hast Du Netz und doppelten Boden eingebaut?
            Habe ich zur Zeit nicht implementiert, da ich es nur vom Browser aufrufe, kann ich das einfach mit der "stopp" Taste im Browser, dem Vrowser wird nach einer Minute (sleep(60)) ein Header gesendet, also geht ein Request an das 2. Script, das gibt wieder einen header und zurück...

            Warum lässt du keinen Daemon laufen (hier: Perl-Script, das obige Aufgabe erfüllt und beim Aufruf mit ('dein_script.pl &' in den Hintergrund geschickt wurde), der das für dich macht. Den schubst du einmal per CGI-Script an und lässt den dann laufen. Lies aber vorher die AGB.

            use Tschoe qw(Matti);

            1. Hi!

              Warum lässt du keinen Daemon laufen (hier: Perl-Script, das obige Aufgabe erfüllt und beim Aufruf mit ('dein_script.pl &' in den Hintergrund geschickt wurde), der das für dich macht. Den schubst du einmal per CGI-Script an und lässt den dann laufen.

              Was ist ein Daemon? Hat PERL keine Laufzeitbegrenzung für Scripte wie PHP? Wie sicher ist es, das das Script durchläuft und nicht irgendwie abgebrochen wird?

              Lies aber vorher die AGB.

              Ich denke das ich sowas natürlich nicht dürfen werde, aber es geht mir erstmal um die Technik, wie man sowas macht, dann kann ich es evtl. mal auf nem eigenen Server probieren(dann aber Win2K). Problem ist nur, das der Server 1 mal am Tag(in der Nacht) automatisch neu gebootet wird, aber zu dem Zeitpunkt wäre ein Ausfall wohl zu verkraften, vor allem da ich vermutlich um 4 Uhr morgens eh nicht sofort was unternehmen würde/könnte ;-) Vielleicht stell ich für sowas mal noch nen einfachen Linux Sever ins LAN, mal schaun.

              Grüße
              Andreas

              1. use Mosche;

                Warum lässt du keinen Daemon laufen (hier: Perl-Script, das obige Aufgabe erfüllt und beim Aufruf mit ('dein_script.pl &' in den Hintergrund geschickt wurde), der das für dich macht. Den schubst du einmal per CGI-Script an und lässt den dann laufen.

                Was ist ein Daemon? Hat PERL keine Laufzeitbegrenzung für Scripte wie PHP? Wie sicher ist es, das das Script durchläuft und nicht irgendwie abgebrochen wird?

                Das hat erstmal nichts mit CGI zu tun, deswegen heisst es umdenken.
                Ob das ganze auch unter Win* funktioniert, weiss ich nicht, da es viel mit dem zu tun hat, wie Unix/Linux/... mit Prozessen umgeht.

                Wenn du unter Linux (oder einem anderen Unix...) einen Prozess startest (wie zB dein Perl-Script, welches einmal die Minute einen Request an einen Server schickt und dann...) kannst du das auf der Shell tun:
                *Beispiel*
                user@host:~> mein_perl.pl
                *AUsgaben des Scripts*

                Du kannst es mit
                user@host:~> mein_perl.pl &
                in den Hintergrund schicken - jetzt werden nur noch Ausgaben auf STDERR auf die Shell geprinted. Du kannst dich dann abmelden und das Programm läuft weiter. Wenn du das ganze jetzt mit einem CGI-Script anstößt (system()) hast du ein Script, welches unabhängig von einem Browser immer läuft (wenn es dein Provider erlaubt).

                use Tschoe qw(Matti);

                1. hi!

                  Was ist ein Daemon? Hat PERL keine Laufzeitbegrenzung für Scripte wie PHP? Wie sicher ist es, das das Script durchläuft und nicht irgendwie abgebrochen wird?

                  Das hat erstmal nichts mit CGI zu tun, deswegen heisst es umdenken.

                  Hat denn PHP_nur_ mit CGI zu tun? Ich kann doch auch in der Shell php-Scripte starten - ohne Browser, aber da gibt es halt desen Timeout, halt in PHP, nicht nur den von Apache! Wobei PHP bei mir in der CGI-Verion läuft, geht dann alles über den Apache?

                  Ob das ganze auch unter Win* funktioniert, weiss ich nicht, da es viel mit dem zu tun hat, wie Unix/Linux/... mit Prozessen umgeht.

                  Ja, das kann schon sein, daher auch die Überlegung einen langsamen(billigen) Linux Server ins Netz zu hängen.

                  Wenn du unter Linux (oder einem anderen Unix...) einen Prozess startest (wie zB dein Perl-Script, welches einmal die Minute einen Request an einen Server schickt und dann...) kannst du das auf der Shell tun:
                  *Beispiel*
                  user@host:~> mein_perl.pl
                  *AUsgaben des Scripts*

                  Du kannst es mit
                  user@host:~> mein_perl.pl &
                  in den Hintergrund schicken - jetzt werden nur noch Ausgaben auf STDERR auf die Shell geprinted. Du kannst dich dann abmelden und das Programm läuft weiter. Wenn du das ganze jetzt mit einem CGI-Script anstößt (system()) hast du ein Script, welches unabhängig von einem Browser immer läuft (wenn es dein Provider erlaubt).

                  Interessant! Aber meine Ping-Pong Version läuft auch ohne Browser mit einem Cronjob!
                  Nur halte ich das für sehr unsicher, also die wahrscheinlichkeit, das das aus irgendeinem Grund(Fehler?) abgebrochen wird dürfte groß sein, aber das ist nur von meinem Gefühl her, ob die Wahrscheinlichkeit tatsächlich größer ist als bei einem durchlaufenden PERL-Script weiß ich nicht.

                  Aber wie machen das denn sonst andere Anbieter, die Monitoring einer Domain anbieten?

                  Viele Grüße
                  Andreas

                  1. Hallo nochmal,

                    in diesem Zusammenhang interessiere ich mich dafür, ob es eine Möglichkeit gibt, den Timeout in PHP nur für EIN Script zu verändern. Könnte ja sein, dass das Script selber Zugriff auf die Systemvariable hat und das dynamisch während der Laufzeit regeln kann.

                    Es gibt da die Funktion set_time_limit(seconds).

                    Bei mir funktioniert die aber nicht. Woran liegts?

                    Grüße

                    Tom

      2. Hi Andreas,

        Wie wäre es, du lässt Perl für dich den Cronjob eintragen?
        Vermute das das nicht geht,

        Probiere es aus ... ;-)

        doch, man kann ja nur Cronjobs nur täglich ausführen, oder ist das
        eine Beschränkung durch meinen Provider?

        Ja, natürlich.
        Eine derartige Einschränkung ist ja inhaltlich durch nichts zu
        rechtfertigen, au0er dadurch, Kunden wie Dich damit auszunehmen.

        Denn in dem Falle hieße es 1440 Cronjobs die ich bräuchte, und das
        kann es ja nicht sein.

        Eben. Es muß also am Provider liegen und nicht am cron-Mechanismus,
        der weit mehr kann:

        crontab Entry Format
             A crontab file consists of lines of  six  fields  each.  The
             fields  are  separated by spaces or tabs. The first five are
             integer patterns that specify the following:

        minute (0-59),
             hour (0-23),
             day of the month (1-31),
             month of the year (1-12),
             day of the week (0-6 with 0=Sunday).

        Each of these patterns may be either an  asterisk   (meaning
             all legal values) or a list of elements separated by commas.
             An element is either a number or two numbers separated by  a
             minus  sign  (meaning  an  inclusive  range).  Note that the
             specification of days may be made by two fields (day of  the
             month and day of the week). Both are adhered to if specified
             as a list of elements.  See EXAMPLES.

        "Einmal pro Minute" ist also ein Stern in jedem der 6 ersten Felder.

        Viele Grüße
              Michael
        (der in seinem 5-Euro-pro-Monat-Paket uneingeschränkt viele cron-Jobs
        verwenden darf)

        1. Hi Michael!

          Wie wäre es, du lässt Perl für dich den Cronjob eintragen?
          Vermute das das nicht geht,

          Probiere es aus ... ;-)

          Guter Tip, aber leider kann ich das mit meinen doch noch sehr beschränkten PERL-Kenntnissen nicht "mal eben" ausprobieren. Bevor ich sowas in Erwägung ziehe müßte ich erst wissen, ob es wenigstens theoretisch geht ;-)

          doch, man kann ja nur Cronjobs nur täglich ausführen, oder ist das
          eine Beschränkung durch meinen Provider?

          Ja, natürlich.
          Eine derartige Einschränkung ist ja inhaltlich durch nichts zu
          rechtfertigen, au0er dadurch, Kunden wie Dich damit auszunehmen.

          Naja, der Provider nimmt an das Cronjobs meist sehr Recourcen-fressende Scripte starten, wobei ich es glaub ich nicht unbedingt was damit zu tun hat, gerade bei wiederholten aufrufen, naja.

          Denn in dem Falle hieße es 1440 Cronjobs die ich bräuchte, und das
          kann es ja nicht sein.

          Eben. Es muß also am Provider liegen und nicht am cron-Mechanismus,
          der weit mehr kann:

          Ja, aber woher soll ich da wissen? Woher soll ich wissen das ich nach "crontab" suchen muß? Wie gesagt bediene ich das nur über ein Webinterface.

          crontab Entry Format
               A crontab file consists of lines of  six  fields  each.  The
               fields  are  separated by spaces or tabs. The first five are
               integer patterns that specify the following:

          minute (0-59),
               hour (0-23),
               day of the month (1-31),
               month of the year (1-12),
               day of the week (0-6 with 0=Sunday).

          Each of these patterns may be either an  asterisk   (meaning
               all legal values) or a list of elements separated by commas.
               An element is either a number or two numbers separated by  a
               minus  sign  (meaning  an  inclusive  range).  Note that the
               specification of days may be made by two fields (day of  the
               month and day of the week). Both are adhered to if specified
               as a list of elements.  See EXAMPLES.

          "Einmal pro Minute" ist also ein Stern in jedem der 6 ersten Felder.

          "also"? Wo steht das?

          (der in seinem 5-Euro-pro-Monat-Paket uneingeschränkt viele cron-Jobs
          verwenden darf)

          ????????????? Wie geht das? Welcher Provider erlaubt sowas?

          Grüße
          Andreas

          1. Hallo nochmal!

            Habe ein bisschen mit SSH probiert, aber außer "man crontab" hat nichts funktioniert:

            (00:53:20) [andreas] whereis crontab
            crontab: /usr/man/man1/crontab.1.gz /usr/man/man5/crontab.5.gz
            (00:54:01) [andreas] crontab -h
            bash: crontab: command not found

            sieht so aus als gäbe es nur das Manual, oder?
            Im Webinterface kann ich die Zeit leider nur aus einem Select-Feld 15-Minutenweise auswählen.

            Welcher User ist das denn, wenn es funktionieren würde, also crontab -u user? Mein SSH-Username?

            Grüße
            Andreas

            1. Hi Andreas,

              (00:54:01) [andreas] crontab -h
              bash: crontab: command not found

              hm ... das sieht so aus, als habe der Admin "crontab" für Normalsterbliche
              zugenagelt. Dabei reicht ja schon, wenn er das x-Bit für "others" wegnimmt,
              damit Du es nicht mehr finden kannst.

              Im Webinterface kann ich die Zeit leider nur aus einem Select-Feld
              15-Minutenweise auswählen.

              Und genau das würdest Du über direktes crontab prima unterlaufen können

              • insofern ist verständlich, daß Du das nicht darfst.

              Welcher User ist das denn, wenn es funktionieren würde, also crontab -u
              user? Mein SSH-Username?

              Oh, "-u" kannte ich noch gar nicht. (Unter Solaris gibt es nur "-elr".)

              Normalsterbliche können "crontab" automatisch nur unter ihrer eigenen
              Kennung laufen lassen; wenn "root" das unter Deiner Kennung tun kann,
              erklärt mir das, wieso Du das "crontab"-Kommando nicht ausführen darfst
              ("root" wird es dürfen und dann on the fly seine Identität auf Deinen
              user wechseln).

              Sieht so aus, als wüßte Dein Provider, was er tut. You lose.

              Immerhin wissen wir jetzt, daß mehr gehen würde, dies aber aktiv
              zugenagelt wurde - das kannst Du für künftige Entscheidungen als
              Information verwenden.

              Viele Grüße
                    Michael

              1. Hallo!

                Immerhin wissen wir jetzt, daß mehr gehen würde, dies aber aktiv
                zugenagelt wurde - das kannst Du für künftige Entscheidungen als
                Information verwenden.

                ich bin mich auch gerade mächtig am beschweren ;-)
                Aber wie es aussieht haben die kein Verständnis. Abe ein extra Cronjob kostet bei denen 2,55 EUR! Und der kann dann nur 1 mal täglich ausgeführt werden. Die sagen das sei so lastenintensiv, wenn man so viele/so oft Cronjobs ausführt bräuchten die neue Hardware und das sei teuer. Ichhab egesagt Cronjob ist nicht = Lastenintensiv, aber die sagten, alleine der Cron-Daemon selbst würde dadurch viel Last erzeugen!

                Naja, leider kenen ich mich nicht gut genug aus im vernünftig argumentieren zu können, aber ich finde es ziemlich lächerlich. 12 Cronjobs würde etwas das doppelte kosten wie ien komplettes Serverpaket mit allem drum und dran. Ich finde da ist keine Relation mehr gewahrt, naja.

                Grüße
                Andreas

                1. Hi Andreas,

                  Aber wie es aussieht haben die kein Verständnis.
                  Aber ein extra Cronjob kostet bei denen 2,55 EUR!

                  willkommen im Land der Abzocker.
                  (Mein ganzer Webspace kostet nur das Doppelte.)

                  Und der kann dann nur 1 mal täglich ausgeführt
                  werden. Die sagen das sei so lastenintensiv, wenn
                  man so viele/so oft Cronjobs ausführt bräuchten
                  die neue Hardware und das sei teuer.

                  Das hängt aber nicht nur von der Anzahl der Jobs ab
                  (naja, wenn es viele sind, dann vielleicht schon),
                  sondern vor allem vom Aufwand jedes Jobs.
                  Ein einzelner schlecht programmierter Auftrag kann
                  mehr Last verursachen als hunderte kleiner Jobs.

                  Wenn Dein Provider vernünftig wäre, dann hätte jeder
                  Kunde eine eigene Benutzerkennung und ein CPU-Zeit-
                  Abrechnungskonto und eine Begrenzung auf <n> Sekunden
                  pro Monat, und fertig ist die Laube. Das ist alles
                  fertig im Betriebssystem mit dabei - man muß es nur
                  verstehen und einschalten. (Was glaubst Du, wie das
                  vor 20 Jahren war, als einzelne CPU-Sekunden noch
                  mehrere DM kosteten?)
                  Ich verstehe ja, daß der nicht zuviel Last auf der
                  Maschine haben will. Aber die Methoden, die er ver-
                  wendet, sind IMHO haarsträubend.

                  Ich hab egesagt Cronjob ist nicht = Lastenintensiv,
                  aber die sagten, alleine der Cron-Daemon selbst
                  würde dadurch viel Last erzeugen!

                  Der cron-daemon hat mehr zu tun, wenn er tausend
                  definierte Jobs verwalten muß als nur einen einzigen,
                  der oft ausgeführt werden soll. Er muß ja periodisch
                  (z. B. zu Beginn jeder neuen Sekunde) alle definier-
                  ten Jobs prüfen, welche davon gestartet werden sollen.

                  Naja, leider kenen ich mich nicht gut genug aus im
                  vernünftig argumentieren zu können, aber ich finde
                  es ziemlich lächerlich. 12 Cronjobs würde etwas das
                  doppelte kosten wie ien komplettes Serverpaket mit
                  allem drum und dran. Ich finde da ist keine Relation
                  mehr gewahrt, naja.

                  Full ACK. Suche Dir einen Provider, der Deine An-
                  forderungen erfüllt.

                  Viele Grüße
                        Michael

                  1. Hallo Michael!

                    willkommen im Land der Abzocker.
                    (Mein ganzer Webspace kostet nur das Doppelte.)

                    Bei welchen Provider bist Du denn?

                    Das hängt aber nicht nur von der Anzahl der Jobs ab
                    (naja, wenn es viele sind, dann vielleicht schon),
                    sondern vor allem vom Aufwand jedes Jobs.

                    Ja aber mal so im Verhältnis zu anderer Serversoftware, ich habe htmldoc installiert, das mir "on the fly" andauernd neue pdfs erstellt. Genau so mit Thumbnails, fast auf alen Seiten verwende ich DB-Abfragen... und fast nur PHP... Das ist doch alles recht lastenintensiv und auch in CPU-Last ,Laufzeit und RAM der einzelnen Scripte beschränkt. Selbige Beschränkungen gibt es bei Cronjobs. Für mich stellt sihc die Frage, unabhängig von z.B. einem per Cron ausgeführten PHp-Script, wieviel Last erzeugt der Cronjob selbst, jetzt im Vergleich zu obigen Scripten?

                    Ein einzelner schlecht programmierter Auftrag kann
                    mehr Last verursachen als hunderte kleiner Jobs.

                    Wie kann man einen Cronjob schlehct programmieren? Meinst DU das ausgeführte Script oder den Cronjob sebst, den da sollte man wohl nicht viel falsch machen können, oder?

                    Wenn Dein Provider vernünftig wäre, dann hätte jeder
                    Kunde eine eigene Benutzerkennung und ein CPU-Zeit-
                    Abrechnungskonto und eine Begrenzung auf <n> Sekunden
                    pro Monat, und fertig ist die Laube. Das ist alles
                    fertig im Betriebssystem mit dabei - man muß es nur
                    verstehen und einschalten. (Was glaubst Du, wie das
                    vor 20 Jahren war, als einzelne CPU-Sekunden noch
                    mehrere DM kosteten?)

                    Das wäre gut, aber das CPU-Konto bezieht sich dann auf alle Scripte, oder nur auf durch Cronjobs gestartete Scripte oder nur für den Cron-Daemon und das Starten der Scritpe?

                    Ich verstehe ja, daß der nicht zuviel Last auf der
                    Maschine haben will. Aber die Methoden, die er ver-
                    wendet, sind IMHO haarsträubend.

                    Naja, aber sicher!

                    Full ACK. Suche Dir einen Provider, der Deine An-
                    forderungen erfüllt.

                    Eigentlih bin ich da ganz zufrieden, wenn ich das möchte installiert er alle mögliche Software für mich, manche Sachen kan ich sogar über SSH machen, oder auch PERL-Module... meistens ein paar Minuten nach der Anfrage läuft es... udn dann auf allen virtuellen Hosts, das ist nicht schlecht. Außerde ist der Support sehr gut, die gucken sich sogar meien Scripte an und sagen mir warum der Fehler aufgertreten ist..., aber nicht jeder von denene, muß man halt den richtigen erwischen.
                    Zur not kann ich ja jetzt auf der Windows-Maschine geplante Tasks ausführen, und dann mit plink ein Script über SSH auf dem Unix-Rechner anstoßen, habs schon probiert, läuft super! Nur leider ist der halt nicht immer online, sollte zwar, naja.

                    Grüße
                    Andreas