Cronjob wird nicht ausgeführt, Debian Lenny

Hallo Forum!

Ich habe mir ein Backup-Script für meine SQL-Datenbank geschrieben. Rufe ich es per sh /pfad/zum/skript/skript.sh auf, funktioniert es auch einwandfrei.
Nun wollte ich, dass das Skript täglich um 1 Uhr nachts aufgerufen wird, aber es passiert leider gar nichts.

Ich habe das Skript im Ordner /etc/cron.daily/ gespeichert und mittels crontab -e folgenden cronjob angelegt:

0 1 * * * sh /etc/cron.daily/skript.sh

der zielordner ist schreibbar für die backups, und das skript selbst hat auch 0755 als chmod.

Was mache ich falsch?

Ps: Ich nutze Debian Lenny.

Hallo,

es sieht alles richtig aus. Sehe den Fehler gerade nicht.

  • Leerzeile in die crontab einfügen. Die Letzte Zeile sollte eine Leerzeile sein.

  • testen ob Ihr skript ausgeführt würde
    run-parts --test /etc/cron.daily

Ich habe das Skript im Ordner /etc/cron.daily/ gespeichert und
mittels crontab -e folgenden cronjob angelegt:

Zunächst einmal deutet deine Vorgehensweise darauf hin, dass du den Sinn der cron.daily nicht ganz verstanden hast. Skripte, die dort liegen, werden von einem eigenen Dienst anacron verwaltet. Ein zusätzlicher Aufruf per Crontab muss nicht, kann aber zu unerwünschten Ergebnissen führen. Gerade bei Datensicherungen in mehreren Generationen (typisch z. B. unter /var/log/ die syslog, syslog.1, syslog.2.gz…) kann das dazu führen, dass jede zweite Generation überschrieben wird.

Der Anacron-Dienst ist speziell für Workstations gedacht, bei denen nicht sichergestellt ist, dass der Rechner zu einem bestimmten Zeitpunkt eingeschaltet ist. Der Dienst holt eine verpasste Aufgabe dann zum nächstmöglichen Zeitpunkt nach. Wenn Anacron allerdings nicht installiert ist, oder wenn dein Script auf doppelte Aufrufe nicht allergisch reagiert, ist deine Vorgehensweise zwar unüblich, müsste aber dennoch problemlos funktionieren.

Dein Problem dürfte eine ganz andere Ursache haben. Darüber kann ich zwar nur spekulieren, aber der Fehler ist eigentlich immer der gleiche: Du verläßt dich im Script auf eine Umgebung, die das Script, per cronjob aufgerufen, nicht vorfindet.

Wenn du testest, tust du das in einer shell-Session, die insbesondere bezügl. des Environment und der X-Einbindung auf deinen aktuellen Desktop zugeschnitten ist. Cronjobs hingegen laufen völlig unabhängig davon, sie sind deiner normalen Umgebung gegenüber blind wie ein Kücken im Ei.

Das bedeutet, dass du _alle_ Verweise auf Dateien gleich welcher Art vollqualifiziert schreiben musst. Also z. B. /bin/cp oder /usr/bin/rename anstelle der sonst völlig ausreichenden cp und rename. Und wenn du in deinem Script ein Programm aufrufst, das auf den Zugriff auf eine X-Session angewiesen ist, musst du explizit eine Verbindung zu dieser Session angeben (und der Eigentümer der X-Session muss in dieser Session angemeldet sein).

Um z. B. immer morgens um 7 mit Hilfe von xine einen Wecker krähen zu lassen, lautet der crontab-Eintrag nicht

# m h dom mon dow command
00 07 \* \* \* /usr/bin/xine /home/user/weckruf.wav

sondern

# m h dom mon dow command
00 07 \* \* \* DISPLAY=:0 XAUTHORITY=/home/user/.Xauthority /usr/bin/xine /home/user/weckruf.wav

HTH

Hallo! Vielen Dank für die aufschluss- und umfangreiche Antwort!
Ich habe mittlerweile meinen Fehler gefunden und auch den Sinn der Cron.daily verstanden. Den mittels crontab -e angelegten job habe ich wieder gelöscht. Der Fehler lag am Skript selbst. In der ersten Zeile fehlte

#!/bin/sh

.

Nun funktioniert es so wie soll.
Aus Ihrer Mail konnte ich dennoch einiges Lernen! Vielen Dank dafür und ein angenehmes Wochenende!

Gruß, David.

Hallo! Vielen Dank für die Antwort. Mittlerweile habe ich gelernt, dass Skripte die unter cron.daily liegen generell automatisch ausgeführt werden. Ich sah die Ordner cron.daily, cron.hourly etc eher als vorgegebene „Ordnerstruktur“ an, um den Überblick zu behalten.

Der Fehler lag im Skript an sich.

In der ersten Zeile fehlte das

#!/bin/sh

.

Nun funktioniert alles so wie es soll. Dennoch vielen Dank für die Antwort und ein schönes Wochenende!

hallo chaot1091,

funktioniert ein einfacher cron-job a la
39 * * * * date >>/tmp/cron.date

Ich habe das Skript im Ordner /etc/cron.daily/ gespeichert und
mittels crontab -e folgenden cronjob angelegt:
0 1 * * * sh /etc/cron.daily/skript.sh

dinge, die unter cron.daily liegen, werden von anacron
(ohne zusätzlichen crontab-eintrag) ausgeführt:
cat /etc/crontab

warum bei dir gar nix passiert, weiß ich nicht, aber
mach doch entweder einen anacron-eintrag (/etc/cron.daily)
oder einen echten handgemachten (crontab -e).

der output des scripts sollte als mail an den ausführenden
user geschickt werden. erzeugt dein script eine ausgabe?
wenn nein, dann rufs doch testweise mit „/bin/sh -x“ auf.
nur um zu sehen, ob überhaupt was anspringt…

gruß
people

Hi,

nimm mal /bin/sh statt nur sh. Hast Du das Skript mal manuell aufgeführt und es funktioniert einwandfrei? Es gab vor 10 Jahren mal einen Bug, wo eine 0 (Null) ein Problem hatte. Daher starte ich Skript oft um 4 Uhr und 10 Minuten oder so…

Gruß
Rolf

Hallo,
wenn du selbst den Eintrag in der crontab verwaltest würde ich nicht das Script in den daily Ordner tun…

Ich habe das Skript im Ordner /etc/cron.daily/ gespeichert und
mittels crontab -e folgenden cronjob angelegt:
0 1 * * * sh /etc/cron.daily/skript.sh

Tut mir Leid, ich kann keinen Fehler entdecken. Prüfe nach, ob PATH & „SHELL=/bin/sh“ (oder ähnlich) gesetzt ist (dann reichte afaik der scriptname, ohne „sh“) und dass du die contab als root edititierst (ich nehme mal an das script soll dann auch mit root-rechten laufen?).

Hallo chaot1091

Ich habe das Skript im Ordner /etc/cron.daily/ gespeichert und
mittels crontab -e folgenden cronjob angelegt:

0 1 * * * sh /etc/cron.daily/skript.sh

Das ist quasi doppelt gemoppelt: ein ausführbares Skript in „/etc/cron.daily“ wird ohnehin täglich ausgeführt (genaue Zeit ist über „/etc/crontab“ festlegbar).

Wenn du den cronjob so anlegst:

0 1 \* \* \* /pfad/zu/deinem/skript

wird das erfolgreich ausgeführt?

Gruss
Sam

Hi,
ich gehe mal davon aus, das der cron-daemon läuft (als Prozess). Dann versuch mal eine anderen Befehl auszufürhen, bzw die Zeit / die tage zu ändern an dem der Befehl ausgeführt werden soll.
Wenn das funktioniert, als welcher User wird der Befehl ausgeführt, soll nat. root, wenn nicht, kann es auch an den Dateirechten liegen, dann gibts noch irgenwo (weis nicht genau) ne system-protokoll Datei, in der alles was funzt / nich funzt protokolliert wird, evtl is dort ne erklärung, bzw fehlermeldung zu finden. Es gibt ja seit einigen Jahren ein anderen job / anderes prinzip als ersatz für cron daemon, deshlb kann schon gut sein, das der nicht läuft.
Evtl. kann man ja den befehl auch durch das, was den crond ersetzen soll, ausführen lassen.

Ps: Ich nutze Debian Lenny.