Cronjob führt kein Skript aus

629
Jim

Ich habe ein Skript erstellt, um meine externe IP-Adresse zu erhalten. Überprüfen Sie, ob sich die IP-Adresse geändert hat. Falls dies der Fall ist, senden Sie sie per E-Mail an mich.

Hier ist das Skript mit dem passenden Namen ip.sh(Server-Hostname ist "odin"):

#!/bin/sh  # Start by renaming file "current-ip" to "old-ip" mv -f /var/www/html/scripts/current-ip /var/www/html/scripts/old-ip # Create new "current-ip" with the email's subject line echo 'Subject: Odin has a new IP address' >> /var/www/html/scripts/current-ip # Add a blank line echo '' >> /var/www/html/scripts/current-ip # Add some text to make the email slightly more readable echo 'It seems as if a new IP address as been assigned to Odin:' >> /var/www/html/scripts/current-ip # Get my external IP address and add it to a new line curl http://ipecho.net/plain -w "\n" >> /var/www/html/scripts/current-ip # Set permission to make the file readable and writeable chmod 766 /var/www/html/scripts/current-ip  # Check to see if the newly built "current-ip" matches the old file if diff /var/www/html/scripts/current-ip /var/www/html/scripts/old-ip >/dev/null ; then # if it does, do nothing exit # Otherwise send that email! else ssmtp -F"Odin" my_emial_address@gmail.com < /var/www/html/scripts/current-ip fi 

Um dies zu testen, bearbeite ich die current-ip-Datei in etwas anderes und führe dann das Skript aus. ./ip.shEs funktioniert wie ein Zauber. Ich erhalte meine E-Mail von "Odin", die mir meine neue IP-Adresse mitteilt. Fantastisch.

Also erstelle ich einen Symlink:

ln /var/www/html/scripts/ip.sh /sbin/odinip 

Und teste es durch Laufen odinip. Funktioniert perfekt.

Dann mache ich den Cronjob mit crontab -e und gebe folgende Zeile ein:

*/5 * * * * /sbin/odinip 

Ich füge auch die folgende Zeile hinzu, um sicherzustellen, dass cron funktioniert:

*/5 * * * * env > /var/www/html/scripts/env.output 

Dann bearbeite ich die current-ipDatei erneut, um sicherzustellen, dass es einen Unterschied gibt, wenn der Cronjob ausgeführt wird.

Dann warte ich und warte und warte. Die Datei env.output wird erstellt, es werden jedoch keine E-Mails gesendet.

Überprüfen des Syslog ( tail -n25 /var/log/syslog) bekomme ich:

May 9 13:40:01 odin CRON[7371]: (root) CMD (env > /var/www/html/scripts/env.output) May 9 13:40:04 odin CRON[7341]: (CRON) info (No MTA installed, discarding output) May 9 13:40:38 odin crontab[7429]: (root) BEGIN EDIT (root) May 9 13:40:47 odin crontab[7429]: (root) END EDIT (root) May 9 13:40:49 odin crontab[7451]: (root) BEGIN EDIT (root) May 9 13:41:01 odin CRON[7478]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh) May 9 13:41:16 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May 9 13:42:46 2016 [try http://www.rsyslog.com/e/2007 ] May 9 13:41:30 odin crontab[7451]: (root) END EDIT (root) May 9 13:41:31 odin crontab[7513]: (root) BEGIN EDIT (root) May 9 13:41:44 odin crontab[7513]: (root) END EDIT (root) May 9 13:41:46 odin crontab[7548]: (root) BEGIN EDIT (root) May 9 13:42:01 odin CRON[7587]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh) May 9 13:42:46 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May 9 13:44:16 2016 [try http://www.rsyslog.com/e/2007 ] May 9 13:43:01 odin CRON[7690]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh) May 9 13:43:41 odin crontab[7548]: (root) REPLACE (root) May 9 13:43:41 odin crontab[7548]: (root) END EDIT (root) May 9 13:44:01 odin cron[360]: (root) RELOAD (crontabs/root) May 9 13:44:01 odin CRON[7771]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh) May 9 13:44:18 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May 9 13:45:48 2016 [try http://www.rsyslog.com/e/2007 ] May 9 13:45:01 odin CRON[7849]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh) May 9 13:45:01 odin CRON[7850]: (root) CMD (/home/jim/duckdns/duck.sh >/dev/null 2>&1) May 9 13:45:01 odin CRON[7851]: (root) CMD (/sbin/odinip) May 9 13:45:04 odin CRON[7829]: (CRON) info (No MTA installed, discarding output) May 9 13:45:51 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May 9 13:47:21 2016 [try http://www.rsyslog.com/e/2007 ] May 9 13:46:01 odin CRON[7943]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh) 

cpuTemp.shist nur ein weiteres Skript, das ich dort ausgeführt habe. Vielleicht etwas davon, dass es keinen Mail-Transport-Agent gibt? Aber wie funktioniert es, wenn ich es manuell ausführe?

Weitere Informationen: Alle Befehle werden ausgeführt und Dateien bearbeitet und Crontab-Bearbeitungen als root vorgenommen. All dies geschieht auf einem Rasberry Pi 2, auf dem Jessie ausgeführt wird. Vor kurzem aktualisiert und aktualisiert.

1
Ich habe vor langer Zeit eine SuSE-Box geerbt, deren Cron nicht erkannt hat, dass ihre Listen geändert wurden, bis sie neu gestartet wurde. Gombai Sándor vor 7 Jahren 0

2 Antworten auf die Frage

1
Jim

Oh wow. Die Antwort: Verwenden Sie vollständige Pfade

Ich dachte, ich hätte genau das getan, bis ich herausfand, dass jemand anderes ein Problem mit ssmtp direkt von der Crontab hatte.

Sie hatten:

0 9 * * * ssmtp a@hotmail.com < /home/a/a-msg.txt 

und musste es ändern

0 9 * * * /usr/sbin/ssmtp a@hotmail.com < /home/a/a-msg.txt 

Was anscheinend das Problem behoben hat.

Ich hingegen verwies auf ssmtp aus dem Bash-Skript ( ip.sh) mit der Zeile:

ssmtp -F"Odin" my_emial_address@gmail.com < /var/www/html/scripts/current-ip 

Also habe ich es aktualisiert

/usr/sbin/ssmtp -F"Odin" my_emial_address@gmail.com < /var/www/html/scripts/current-ip 

Geändert, der Inhalt der aktuellen IP, um die elseif-Anweisung zum Schießen zu zwingen, und es schien zu funktionieren. Ich teste und aktualisiere das, wenn ich andere Fehler finde.

0
DOK

Cron verwendet oder speichert Ihre Umgebung bei der Ausführung der Befehle nicht, daher können Pfade und andere Umgebungsvariablen nicht Ihren Erwartungen entsprechen.

Wie Sie bereits herausgefunden haben, besteht die beste Möglichkeit, Probleme zu vermeiden, indem Sie immer den vollständigen Pfad zu Befehlen verwenden, die Sie mit cron ausführen.