FrankS: Einrichten eines cronjobs

Hallo Unixkenner!

Ich habe folgendes Problem:
Ich habe mit crontab <filename> eine crontab eingerichtet. Mit crontab -l kann ich mir die crontab ausgeben lassen, steht auch alles wie gewollt drin:
0 6 * * * /absoluter/pfad/zum/script/script.pl >/dev/null
(also jeden Tag um 6:00 Uhr soll script.pl gestartet werden)
Nur das Script startet nicht, trotzdem cron läuft...

Wenn ich das Script per Hand starte (telnet, einfach /absoluter/pfad/zum/script/script.pl eingetippt und <enter>), dann läufts, das script ist also OK.
Lasse ich in der crontab >/dev/null weg, dann sollte ich bei Fehlern des cronjobs ja eine mail bekommen - ich kriege aber keine. Mit >/absoluter/pfad/zum/logfile/error_log sollten die Fehler in dieser Datei landen. Die bleibt aber auch leer...

Sieht also so aus, als ob der job garnicht ausgeführt wird. Was mache ich falsch?

Vielen Dank, auf Antwort hoffend,
Gruß Frank

  1. Hallo Unixkenner!

    Ich habe folgendes Problem:
    Ich habe mit crontab <filename> eine crontab eingerichtet. Mit crontab -l kann ich mir die crontab ausgeben lassen, steht auch alles wie gewollt drin:
    0 6 * * * /absoluter/pfad/zum/script/script.pl >/dev/null
    (also jeden Tag um 6:00 Uhr soll script.pl gestartet werden)
    Nur das Script startet nicht, trotzdem cron läuft...

    Wenn ich das Script per Hand starte (telnet, einfach /absoluter/pfad/zum/script/script.pl eingetippt und <enter>), dann läufts, das script ist also OK.
    Lasse ich in der crontab >/dev/null weg, dann sollte ich bei Fehlern des cronjobs ja eine mail bekommen - ich kriege aber keine. Mit >/absoluter/pfad/zum/logfile/error_log sollten die Fehler in dieser Datei landen. Die bleibt aber auch leer...

    Sieht also so aus, als ob der job garnicht ausgeführt wird. Was mache ich falsch?

    Was steht in deiner Syslog?

    1. Hallo Erik!

      Was steht in deiner Syslog?

      Ich bin ein absoluter UNIX-Neuling. Wo finde ich die Datei?

      Danke und Gruß Frank
      P.S. siehe auch meine Antwort auf Rolfs Posting

      1. hi!

        Was steht in deiner Syslog?
        Ich bin ein absoluter UNIX-Neuling. Wo finde ich die Datei?

        Wenn ich tippen müsste: /var/log/cron oder /var/cron/log.

        bye, Frank!

        1. Frank an Frank!

          Wenn ich tippen müsste: /var/log/cron oder /var/cron/log.

          in die cron-Logfiles kann ich leider nicht reinsehen:
          ls -l /var/cron/
          total 2144
          -rw------- 1 root root 542366 May 24 15:31 log
          -rw------- 1 root bin 524901 May 7 03:10 olog

          Schade...
          Trotzdem danke,

          Gruß Frank

          1. Frank an Frank!

            Wenn ich tippen müsste: /var/log/cron oder /var/cron/log.
            in die cron-Logfiles kann ich leider nicht reinsehen:
            ls -l /var/cron/
            total 2144
            -rw------- 1 root root 542366 May 24 15:31 log
            -rw------- 1 root bin 524901 May 7 03:10 olog

            Schade...
            Trotzdem danke,

            Werf mal nen Blick in /var/log. Da sollte was dabei sein.

  2. Hallo Frank,

    Ich habe mit crontab <filename> eine crontab eingerichtet. Mit crontab -l kann ich mir die crontab ausgeben lassen, steht auch alles wie gewollt drin:
    0 6 * * * /absoluter/pfad/zum/script/script.pl >/dev/null
    (also jeden Tag um 6:00 Uhr soll script.pl gestartet werden)

    Zum Erzeugen eines Cronjobs einfach "crontab -e" eingeben, dann öffnet sich der "VI" und Du kannst damit für Dein Benutzerkonto die Jobs eintragen, schau einfach mal auf http://www.i-netlab.de/unix/unix.htm#a2... ; Viele Grüße, Rolf

    1. Hallo Rolf!

      Zum Erzeugen eines Cronjobs einfach "crontab -e" eingeben, dann öffnet sich der
      "VI" und Du kannst damit für Dein Benutzerkonto die Jobs eintragen

      Es geht auch ohne "-e":
      (aus "man crontab")
      <cite>
      DESCRIPTION
      The crontab utility manages a user's access with cron by
      copying, creating, listing, and removing crontab files. If
      invoked without options, crontab copies the specified file,
      or the standard input if no file is specified, into a direc-
      tory that holds all users' crontabs.
      </cite>

      Wenn ich "crontab mycrontab" eingebe, wird das File 'mycrontab' nach var/spool/cron/crontabs/mein_user_name copiert. Das geht auch, denn mit "crontab -l" sehe ich ja meinen Eintrag.

      Diese Dateien stehen im crontab directory, die frank_s ist meine.
      ls -l /var/spool/cron/crontabs
      total 8
      -rw-r--r-- 1 root sys 190 Apr 30 1999 adm
      -r-------- 1 root frank_s 97 May 24 13:45 frank_s
      -r--r--r-- 1 root root 750 Apr 30 1999 lp
      -r-------- 1 root other 944 Apr 18 22:26 root

      Sind die Rechte vielleicht falsch? Die Datei gehört root. Also sollte ein root cron da lesen können, oder...(???). Cron läuft, jedenfalls wird er bei "ps -A" angezeigt.

      Schon mal besten Dank für die Antworten,
      Gruß Frank
      P.S.Ich muss noch was gestehen: ich habe keinen Telnetzugang (gibts bei dem Provider nicht...:-( ), da habe ich mir ein CGI-Script geschrieben, dem ich das 'command' Übergebe und das es dann ausführt. Was das 'command' zurückgibt, wird vom Script an den Browser gesendet (daher neulich meine Frage <../../sfarchiv/2000_2/t13956.htm>). Natürlich liegt dieses Script in einem geschützen Verzeichnis...

      1. Hallo,

        P.S.Ich muss noch was gestehen: ich habe keinen Telnetzugang (gibts bei dem Provider nicht...:-( ), da habe ich mir ein CGI-Script geschrieben, dem ich das 'command' Übergebe und das es dann ausführt. Was das 'command' zurückgibt, wird vom Script an den Browser gesendet (daher neulich meine Frage <../../sfarchiv/2000_2/t13956.htm>). Natürlich liegt dieses Script in einem geschützen Verzeichnis...

        Also Du machst das übern CGI? Dann bist Du ja nicht der Besitzer des cronjobs sondern der _der_ ihn schreibt, also any ChildProzess des Webservers!

        Das ist alles sehr sehr bedenklich, anderer Provider, denke ich ;-)

        Viele Grüße, Rolf

        1. Hallo,

          Hallo zurück!

          Also Du machst das übern CGI? Dann bist Du ja nicht der Besitzer des cronjobs
          sondern der _der_ ihn schreibt, also any ChildProzess des Webservers!

          Ist doch egal, oder? Der, der "crontab mycrontab" aufruft, erstellt, in /var/spool/cron/crontabs/ _seine_ crontab. Mit dem Aufruf von crontab wird der cron-prozess informiert, das sich was geändert hat und er initialisiert seine Starttabellen (oder wie auch immer er das verwaltet) neu. Dabei sollte er alle in /var/spool/cron/crontabs liegenden Dateien lesen. Ob ich oder der "Server" das tut, ist doch nur in sofern wichtig, als das dies den Dateinamen für die crontab festlegt. Und für den Zugriff auf crontab, der ja über Einträge des Users in cron.allow und cron.deny geregelt wird. Da cron.allow nicht existiert und cron.deny nichts _entscheidendes_ enthält, sollte es gehen.
          Besonderheit auf meinem Server (ok, dem meines Providers...): Die CGIs laufen IMMER unter der User-ID des Users. Als Recht reicht 700. Also bin ich doch der Besitzer des cronjobs, wenn er aus dem Script heraus erstellt wird... Sonst wäre ja auch der Name der crontab nicht mein User_name (frank_s).

          Das ist alles sehr sehr bedenklich, anderer Provider, denke ich ;-)

          alles andere ist ja ok - und wenn ich beim Provider anrufe, richtet er mir ja den cronjob ein. Ich will aber etwas unabhängiger sein...

          Nun muß ich aber schluss machen für heute, habe noch viel anderes zu tun... bis morgen.
          Viele Grüße
          Frank

          P.S.
          cat /etc/cron.d/cron.deny
          daemon
          bin
          smtp
          nuucp
          listen
          nobody
          noaccess

    2. Hallo Rolf!

      Zu Deinem Link http://www.i-netlab.de/unix/unix.htm#a2: als Beispiel hast Du das angeführt:
      00 00 *  *  *  perl /home/i-netlab.de/cgi-bin/ice2-idx.pl
      eigentlich kannst Du dir doch das "perl" sparen, denn im Script steht doch der Pfad zum Interpreter drin:
      00 00 *  *  *  /home/i-netlab.de/cgi-bin/ice2-idx.pl

      Gruß Frank

      1. Hallo,

        Zu Deinem Link http://www.i-netlab.de/unix/unix.htm#a2: als Beispiel hast Du das angeführt:
        00 00 *  *  *  perl /home/i-netlab.de/cgi-bin/ice2-idx.pl
        eigentlich kannst Du dir doch das "perl" sparen, denn im Script steht doch der Pfad zum Interpreter drin:
        00 00 *  *  *  /home/i-netlab.de/cgi-bin/ice2-idx.pl

        ist im Prinzip richtig Frank, der Interpreter steht drin im Script, aber der Root kann trotzdem festlegen ob das Script mit oder ohne Interpreter aufgerufen werden darf. Und vor dem Umzug meines Webs war das so....

        Viele Grüße, Rolf

        1. Hi Rolf!

          noch schnell geantwortet...:

          ist im Prinzip richtig Frank, der Interpreter steht drin im Script, aber der
          Root kann trotzdem festlegen ob das Script mit oder ohne Interpreter aufgerufen
          werden darf. Und vor dem Umzug meines Webs war das so....

          sollte das mein Problem sein? Ich werds mal ändern...

          Gruß Frank
          P.S.
          Ergebnisse morgen...

      2. Hi,

        Hallo Rolf!

        Zu Deinem Link http://www.i-netlab.de/unix/unix.htm#a2: als Beispiel hast Du das angeführt:
        00 00 *  *  *  perl /home/i-netlab.de/cgi-bin/ice2-idx.pl
        eigentlich kannst Du dir doch das "perl" sparen, denn im Script steht doch der Pfad zum Interpreter drin:
        00 00 *  *  *  /home/i-netlab.de/cgi-bin/ice2-idx.pl

        Das ist sogar die deutlich bessere Lösung!
        Was über telnet funktioniert, funktioniert aus cron heraus keineswegs ebenfalls.
        Denn via Telnet hast Du eine ggf. (über .profile oder was auch immer) initialisierte shell, in welcher insbesondere $PATH sinnvoll gesetzt ist - was Du aus cron heraus keinesfalls annehmen darfst.
        Gut möglich, daß "perl" deshalb so gar nicht gefunden werden kann - ich habe an solchen Stellen schon mal in cron-Kommandos explizit .profile in den Aufruf hinein basteln müssen ...

        Michael

  3. Ich habe mit crontab <filename> eine crontab eingerichtet. Mit crontab -l kann ich mir die crontab ausgeben lassen, steht auch alles wie gewollt drin:
    0 6 * * * /absoluter/pfad/zum/script/script.pl >/dev/null
    (also jeden Tag um 6:00 Uhr soll script.pl gestartet werden)
    Nur das Script startet nicht, trotzdem cron läuft...

    Meistens haben cronjobs aus sicherheitsgruenden ein sehr beschraenktes environment dh PATH variable
    sehr verkuerzt; dh versuche einfach ein minimalscript mit nur shell befehlen zb
    #!/bin/sh

    fuer die "fehler mail"

    /bin/echo "cron laeuft"
    /bin/echo "kann auch eine datei erzeugen" > homeverzeichniss/test.dat

    Wenn ich das Script per Hand starte (telnet, einfach /absoluter/pfad/zum/script/script.pl eingetippt und <enter>), dann läufts, das script ist also OK.
    Lasse ich in der crontab >/dev/null weg, dann sollte ich bei Fehlern des cronjobs ja eine mail bekommen - ich kriege aber keine. Mit >/absoluter/pfad/zum/logfile/error_log sollten die Fehler in dieser Datei landen. Die bleibt aber auch leer...

    Stellt sich die frage ob du als user auf dem server auch die mail bekommst (ls -l /var/spool/mail zB)

    Sieht also so aus, als ob der job garnicht ausgeführt wird. Was mache ich falsch?

    alternativ lass dir von deinem provider einmal ein cronjob einrichten und guck da ab...

    khan

  4. Hallo alle zusammen!

    Vielen Dank für Eure Tips bisher, aber, wie gesagt, es geht noch nicht :-(
    Aber ich habe neue Erkenntnisse: Das Einrichten des Cronjobs, so wie ich es tute geht. Die Datei, in der mein cronjob steht, wird richtig angelegt, und der cron-Prozess will auch das entsprechende Script starten. Das vermute ich jedenfalls, denn zu der Zeit, zu der der Job starten sollte, wird jedesmal das cron-logfile aktualisiert. Nur kann ich da leider nicht reinsehen... Nun habe ich folgene Vermutung: vielleicht findet er mein Script nicht? Ich habe den absoluten Pfad angegeben. Das sollte doch reichen, oder?

    Ich werde wohl doch den Job vom Provider einrichten lassen. Oder hat jemand noch einen Tipp?

    Grüsse von einem entnervten Frank

    1. Ich werde wohl doch den Job vom Provider einrichten lassen. Oder hat jemand noch einen Tipp?

      Idee: einen cronjob ohne script also direkt ein prog ausführen a la
        6 0 * * * /bin/echo "test"
      ausserdem:
      je nach Server-OS / cron version muss ein Benutzer das explizite recht haben
      einen cronjob auszuführen (zB /etc/cron.allow /etc/cron.deny)

      1. Hallo Khan!

        Danke für den Tip, ich werds probieren.

        6 0 * * * /bin/echo "test"

        eine Frage dazu: wo landet das "test", wenns per echo ausgegeben wird? (Du siehst, ich kratze bisher nur an der Oberfläche von Unix...)

        »»  einen cronjob auszuführen (zB /etc/cron.allow /etc/cron.deny)
        Da hab ich auch schon nachgesehen, die .allow existiert nicht, aber die .deny:
        cat  /etc/cron.d/cron.deny
        daemon
        bin
        smtp
        nuucp
        listen
        nobody
        noaccess

        Und laut man crontab dürfen alle, die NICHT in .deny stehen, wenn keine .allow existiert. Meine user ID steht nicht drin...

        Gruß Frank

        1. Hallo ,

          »»   6 0 * * * /bin/echo "test"
          eine Frage dazu: wo landet das "test", wenns per echo ausgegeben wird? (Du siehst, ich kratze bisher nur an der Oberfläche von Unix...)

          Es landet im stdout - und wird dir damit  als mail  zugeschickt (oder zumindest dem benutzer als der das ganze ausgeführt wird)
          Falls du glaubst das diese mail nicht an dich geht kannst du auch /bin/touch /pfad/wohin/auch/immer machen. es geht nur darum ein minimal
          cronjob zu erzeugen.

          Khan