ubuntuusers.de

Mysql-Befehl per Crontab / Skript ausführen

Status: Gelöst | Ubuntu-Version: Server 12.10 (Quantal Quetzal)
Antworten |

Rudflodur

Anmeldungsdatum:
27. Mai 2006

Beiträge: Zähle...

Ich habe ein bash-Skript geschrieben, das einen MySQL-Befehl ausführt (Rücksetzen des Benachrichtigungs-Flags in einem phpBB Forum:

#!/bin/sh

# echo "Rücksetzen der Benachrichtigungs-Flags des Forums"

MY_SOCK='/var/lib/mysql/mysql.sock'
PASWD='####'
UsID='benutzer'
my_db="forum"
#
mysql -u "$UsID" --password="$PASWD" <resetten.sql

echo `date` Beobachten-Flags im Forum erfolgreich zurueckgesetzt >> /var/log/forum

In der Datei resetten.sql steht:

use "forum";
UPDATE `phpbb_forums_watch` SET notify_status='0';
QUIT

Wenn ich das Skript manuell ausführe, funktioniert es einwandfrei. Rufe ich es als cron-Skript auf, läuft das Skript ohne Fehlermeldung ab (mit Meldung in Logfile, dass es erfolgreich abgelaufen ist), aber der SQL-Befehl wird nicht ausgeführt! Wer hat mir einen Tipp, woran das liegen kann? Danke schon im Voraus

rudflodur

UrbanFlash Team-Icon

Avatar von UrbanFlash

Anmeldungsdatum:
21. Februar 2006

Beiträge: 5549

Wohnort: Wien

Bei cron kann man sich nicht auf einen PATH verlassen, deshalb müssen alle Befehle mit vollem Pfad angegeben werden.

Den richtigen Pfad findest du mit which mysql.

curly

Anmeldungsdatum:
2. Mai 2010

Beiträge: 268

Führe dein Skript mit vorangestelltem "env -i " aus. Das ignoriert dein Environment so wie auch cron es tut. Dann kriegst du möglicherweise eine Meldung, die weiterhilft.

Rudflodur

(Themenstarter)

Anmeldungsdatum:
27. Mai 2006

Beiträge: 11

UrbanFlash schrieb:

Bei cron kann man sich nicht auf einen PATH verlassen, deshalb müssen alle Befehle mit vollem Pfad angegeben werden.

Den richtigen Pfad findest du mit which mysql.

Ich bin mir nicht ganz sicher, welchen Pfad Du meinst? Den Pfad zum Forum im SQL-Befehl oder den im bash-Script? Ich dachte, ich hätte das mit MY_Sock erschlagen?

which mysql bringt mir /usr/bin/mysql

UrbanFlash Team-Icon

Avatar von UrbanFlash

Anmeldungsdatum:
21. Februar 2006

Beiträge: 5549

Wohnort: Wien

Und jetzt ersetzt du im Skript die Zeile

mysql -u "$UsID" --password="$PASWD" <resetten.sql

durch

/usr/bin/mysql -u "$UsID" --password="$PASWD" <resetten.sql

Rudflodur

(Themenstarter)

Anmeldungsdatum:
27. Mai 2006

Beiträge: 11

UrbanFlash schrieb:

Und jetzt ersetzt du im Skript die Zeile

mysql -u "$UsID" --password="$PASWD" <resetten.sql

durch

/usr/bin/mysql -u "$UsID" --password="$PASWD" <resetten.sql

Danke Euch beiden. Das Skript läuft mit oder ohne Pfad, mit oder ohne env -i ohne Fehlermeldung durch - es tut aber nicht, was ich hoffe. Bei direktem Aufruf des Skripts geht es, per cron dagegen nicht... Scheint an mysql zu liegen?

Rudflodur

(Themenstarter)

Anmeldungsdatum:
27. Mai 2006

Beiträge: 11

Noch eine Ergänzung: Im kopierten log steht das Datum mal englisch (Cron), mal deutsch (manuell):

Di 6. Nov 18:58:09 CET 2012 Beobachten-Flags im Forum erfolgreich zurueckgesetzt
Tue Nov 6 18:58:57 CET 2012 Beobachten-Flags im Forum erfolgreich zurueckgesetzt

Vielleicht ist das ja von Bedeutung?

UrbanFlash Team-Icon

Avatar von UrbanFlash

Anmeldungsdatum:
21. Februar 2006

Beiträge: 5549

Wohnort: Wien

Hast du bei allen anderen Dateien und Binaries die Pfade ebenfalls hinzugefügt?

ZB ist der Speicherort der resetten.sql überhaupt nicht klar. Wahrscheinlich wird sie einfach nicht gefunden...

Nochmal, Cron kennt deine Userumgebung nicht. Da funktionieren Binaries nur direkt aus /bin oder mit vollem Pfad und relative Pfade laufen auch ins Leere, man kann ja nicht kontrollieren aus welchem Verzeichnis etwas aufgerufen wird...

Rudflodur

(Themenstarter)

Anmeldungsdatum:
27. Mai 2006

Beiträge: 11

Danke UrbanFlash, das scheint es gewesen zu sein!

Antworten |