Cron läuft, aber nichts passiert

3363
Joseph

Ich habe ein Skript mit dem Namen "forward_email.sh" erstellt und die Berechtigungen auf 777 gesetzt. Es enthält die folgende Zeile:

echo "It worked: $(date)" >> /home/noc/email.log 

Ich habe einen Cron-Job mit der folgenden Zeile erstellt:

*/5 * * * * /home/noc/forward_email.sh 

Das Problem ist, dass die Datei "email.log" niemals geändert wird. Ich habe sogar die Berechtigungen auf 666 gesetzt. Wenn ich das Skript manuell ausführe, funktioniert es perfekt.

Der Cron-Job wird gemäß der Datei "/var/log/cron.log" ausgeführt.

Kann mich jemand in die richtige Richtung weisen, was möglicherweise schief läuft? Dies ist eine minimale Installation der virtuellen Maschine von Ubuntu Server 9.04, wobei cron über apt-get installiert ist.

UPDATE : Ich habe einen sehr blöden Fehler gemacht. Ich habe mein Skript "forward_mail.sh" genannt. Ich habe erst einige E-Mail-Dienste installiert und die folgende Fehler-E-Mail von Cron erhalten, dass ich meinen Fehler entdeckt habe.

/bin/sh: /home/noc/forward_email.sh: not found 

Ich habe den Namen der Datei geändert und funktioniert jetzt.

4
Ist das nicht eher eine .. Serverfault-Frage? codingbear vor 14 Jahren 0
Benutzer verwenden Cron. Richard Hoskins vor 14 Jahren 2
Können Sie die Ausgabe von Crontab -l bereitstellen? John T vor 14 Jahren 0
crontab -l gibt die gleiche Zeile in der ursprünglichen Frage aus. Joseph vor 14 Jahren 0
Gibt es /etc/cron.allow? Richard Hoskins vor 14 Jahren 2
Ja, und das einzige, was darin enthalten ist, ist "noc". Joseph vor 14 Jahren 0
Was sind die Berechtigungen von /etc/cron.allow? Gibt es cron.deny? Richard Hoskins vor 14 Jahren 0
-rw-r - r-- 1 root root 10 2009-08-04 01:01 cron.allow cron.deny ist nicht vorhanden. Joseph vor 14 Jahren 0
@Joseph: Dummkopf eines nahm! ;-) Pete vor 14 Jahren 0

4 Antworten auf die Frage

6
David Mackintosh

Viele potentielle Dinge aus meinem Kopf.

Sind Sie sicher, dass der Crontab-Eintrag wirklich auf Ihr Skript zeigt? Wenn Sie beispielsweise ein Skript wie ~ noc / bin / script.sh ausführen möchten, aber einen Eintrag wie / home / noc / bin / script (dh einen subtilen Tippfehler) haben, funktioniert dies natürlich nicht. Normalerweise überprüfe ich meine Crontab-Einträge, indem ich den Befehl mit der Maus aus Crontab kopiert und dann in eine Eingabeaufforderung einfügt. Nur um 100% sicher zu sein, dass er das ausführt, was ich will.

Enthält Ihr Skript nur die angegebene Zeile? Normalerweise müssen Sie Folgendes hinzufügen:

#!/bin/bash 

... ganz oben in Ihrem Skript, damit es funktioniert.

Wenn es komplizierter als die einzelne Zeile ist, sind Sie sicher, dass die Programmierlogik die Ausführung dieser bestimmten Zeile zulässt?

Versuchen Sie, Ihr Skript auf zu reduzieren

#!/bin/bash echo "Bing!" >> /tmp/cronjob 

... um zu sehen was passiert. Wenn das funktioniert, haben Sie ein Programmierproblem in Ihrem cron-Skript. Wenn dies fehlschlägt, haben Sie ein Cron-Problem.

Ist der Benutzer 'noc' derjenige, der das Skript ausführt? Wenn nicht, sind Sie sicher, dass der Benutzer, der das cron-Skript ausführt, über / home / noc Lese- / Schreibzugriff auf die Datei email.log hat?

Wohin geht die Fehler-E-Mail des Benutzers, der den Cronjob ausführt? Wird eine Fehler-E-Mail generiert und dann an einen Ort gesendet, an dem Sie nicht erwartet werden, oder wird der Speicherabzug möglicherweise vollständig gelöscht? Versuchen Sie es mit einem Cronjob

#!/bin/bash echo "Bing!" 

... und versuchen Sie dann herauszufinden, wohin die generierte E-Mail geht.

Sind cron.deny und / oder cron.allow im Spiel? Wenn /etc/cron.allow existiert, muss der User noc darin aufgeführt sein. wenn /etc/cron.deny existiert. Der Benutzer noc darf darin nicht aufgeführt sein. Wenn auf RedHat weder cron.allow noch cron.deny vorhanden sind, darf NUR der root-Benutzer cron verwenden.

Ich habe mein Skript reduziert und es passiert immer noch nichts. Der noc-Benutzer sollte der einzige Benutzer sein, der das Skript ausführt, da es das einzige Konto ist. Ich habe keine E-Mail-Dienste auf diesem Server installiert. Joseph vor 14 Jahren 0
Ähm ... verwendet Ubunto cron.allow und cron.deny? David Mackintosh vor 14 Jahren 0
OK, ich habe dein Update gesehen und bin froh, dass du es herausgefunden hast. David Mackintosh vor 14 Jahren 0
5
Pete

Cron läuft mit begrenzten Umgebungsvariablen, insbesondere Ihren $PATH. Versuchen Sie, den vollständigen Pfad zu beliebigen Binärdateien anzugeben. So /home/noc/forward_email.shsollte es sein:

/bin/echo "It worked: $(date)" >> /home/noc/email.log 

Und was */5tun Sie am Anfang Ihres Skripts? */5läuft alle fünf Minuten 5einmal, jede Stunde einmal 5 Minuten nach der vollen Stunde.

5 * * * * /home/noc/forward_email.sh #* * * * * command to be executed #- - - - - #| | | | | #| | | | +----- day of week (0 - 6) (Sunday=0) #| | | +------- month (1 - 12) #| | +--------- day of month (1 - 31) #| +----------- hour (0 - 23) #+------------- min (0 - 59) 

Haben Sie schließlich die Crontab mit dem folgenden Befehl bearbeitet und gespeichert:

crontab -e 

... wo der Editor von der Umgebungsvariablen ausgewählt wird $EDITOR?

* / 5 läuft es alle 5 Minuten. Wenn Sie nur 5 haben, wird es jede Stunde 5 Minuten nach der vollen Stunde ausgeführt. pgs vor 14 Jahren 2
Das Hinzufügen des vollständigen Pfads hat nichts geändert. Ich habe den Kontrabass mit "crontab -e" erstellt. Der Herausgeber ist Nano. Joseph vor 14 Jahren 0
1
pgs
echo "It worked: $(date)" >> /home/noc/email.log 

Gibt /home/noc/email.loges, bevor Sie das Skript ausführen? Ist es für den Benutzer beschreibbar, der den Cron-Job ausführt? Was passiert, wenn Sie es vorher erstellen? z.B

touch /home/noc/email.log chmod 666 /home/noc/email.log 
Nein Ja. Gleiche Sache. Joseph vor 14 Jahren 0
0
DeaconFraust

Wenn Sie Zweifel an Ihrem Skript haben, setzen Sie die folgende Zeile oben in das Skript:

 #!/bin/bash -x 

(Wenn Sie diese Shell nicht verwenden, setzen Sie einfach die gute)

Starten der Subshell mit der Option -x(e X plicit), die das gesamte Skript im Debug-Modus ausführt. Die Spuren jedes Befehls und seiner Argumente werden in die Standardausgabe geschrieben, nachdem die Befehle erweitert wurden, aber bevor sie ausgeführt wurden.