Anfänger: Hilfe bei Cronjob

mr_baumeister

New Member
Hallo,

ich habe schon Tage mit Suchen verbracht, um einen Cronjob in Plesk zu erstellen - bisher ohne wirklichen Erfolg.

Meine Datei "daily" soll täglich eine DB sichern. Ursprünglich lag sie in etc/cron.daily. Da wurde nach Eintrag in der Crontab auch was ausgeführt. Aber die Sicherung konnte das nie und nimmer sein - die Datei war viel zu klein. Jetzt liegt das Script in cron.aaa

Crontab als root über Plesk erstellt:
0 5 * * * /etc/cron.aaa/daily


Die Datei "daily":

#! /bin/bash

# set var: DIR from root to DIR to save / current day of month
DIR="/srv/www/xxxx"
dayofweek=`date '+%A'`

# set vars: database, user, password
# db1name is the prefix of the new stored/compressed database

db1name=t3_eu
db1=typo3_2
user1=db_typo3_2
pass1=eu_02

# save 7 days a week
# mysqldump --opt -h localhost -u $user1 -p$pass1 $db1 | gzip > $DIR/backup/databases/$db1name.dump.sql.$dayofweek.gz
# TEST unkomprimiert
mysqldump --opt -h localhost -u $user1 -p$pass1 $db1 > $DIR/backup/databases/$db1name_backup.$dayofweek.sql


Nix tut sich. Ausführung über SHELL bringt diese Fehlermeldung:

Befehl '"daily"'
fehlgeschlagen mit Beendigungscode 127 und Fehlernachricht
-bash: line 43: daily: command not found.

Was läuft da falsch?

Roland
 
... versteh ich nicht !
Wo? An welche Stelle soll der vollständige Pfad ? In der Crontab steht er doch.
Kann mir vielleicht jemand mehrsilbig antworten ?

Roland
 
Du sagst, wenn Du das Script aus der Shell heraus aufrufst, kommt die Fehlermeldung. Da schließe ich draus, dass es in der ausführenden Shell nicht gefunden werden kann. Das liegt meistens an einem nicht vollständig angegebenen Pfad.
Was genau Du gemacht hast wird aus Deinen Angaben leider nicht klar, daher muss ich raten. Unklar ist auch, warum ein Fehler in Zeile 43 bemängelt wird obwohl das angegebene Script kaum über zwanzig Zeilen hat, aber wohlmöglich hast Du es aus einem anderen Script heraus aufgerufen...
Man kann Dir leichter helfen, wenn Du mehr Informationen lieferst -- da gehört z.B. auch dazu welche Befehle Du eingegeben hast, die dann zur Fehlermeldung führen (also eine Zeile mehr).
Ansonsten wäre es hilfreich, wenn Du
Code:
-Tags verwenden würdest, dann kann man u.A. besser abschätzen, was noch zum Script gehört.
 
Also ich mache Folgendes:
Ich nutze WinSCP, gehe in das Verzeichnis ect/cron.aaa und wähle dort über rechte Maustaste "Benutzerdefinierte Befehle - > Ausführen"
Wenn ich über putty daily aufrufe - das gleiche:

Während der Ausführung des benutzerdefinierten Befehls "!" mit der Datei 'daily' ist ein Fehler aufgetreten.

Befehl '"daily"'
fehlgeschlagen mit Beendigungscode 127 und Fehlernachricht
-bash: line 38: daily: command not found.


Die Angabe line 38 erhöht sich bei jedem Aufruf um den Faktor 1.

Das Script habe ich mal abgespeckt. Es sieht jetzt so aus:

# !/bin/bash

DIR="/srv/www/xxxxxxx"
dayofweek=`date '+%A'`

db1name=t3_eu
db1=typo3_2
user1=db_typo3_2
pass1=eu_02

# save 7 days a week
# mysqldump --opt -h localhost -u $user1 -p$pass1 $db1 | gzip > $DIR/backup/databases/$db1name.dump.sql.$dayofweek.gz
# TEST unkomprimiert
mysqldump --opt -h localhost -u $user1 -p$pass1 $db1 > $DIR/backup/databases/$db1name_backup_new.sql


Hab ich nochwas vergessen ?
Und schonmal danke für deine Mühe.

Roland
 
Am Anfang hast du schonmal ein Leerzeichen wo keins sein darf...

Es muss #!/bin/bash heißen - ohne Leerzeichen zwischen # und !

Dann wie LinuxAdmin schon geschrieben hat: Wie führst du das Script via putty aus? Du musst entweder /etc/cron.aaa/daily oder - wenn du in /etc/cron.aaa bist - ./daily ausführen.

Was spuckt dein Script dann aus?

Falls /srv/www dein Webserver Root ist, rate ich dir auch dringend davon ab die Backups da hin zu packen. Sonst kann die ja prinzipiell jeder von dort aus abrufen...
 
Stimmt - das Leerzeichen ist mir auch aufgefallen. Hat das Problem aber nicht 100%ig gelöst. Ich bin aber schonmal einen Schritt weiter - und hab wieder eine Menge dazugelernt.
Ich hab das Script jetzt mal ausgeräumt:

#!/bin/bash
mysqldump --opt -h localhost -u namexy -ppasswordxy dbnamexy > backup.sql


Ich gebe folgendes in /etc/cron.aaa ein:
/etc/cron.aaa/daily

Ergibt die Meldung
/etc/cron.aaa$ /etc/cron.aaa/daily
und der Befehl wird ausgeführt !

Warum es bisher per Crontab nicht funktionierte, liegt entweder am Leerzeichen oder an den ursprünglichen Scriptbestandteilen. In der Crontab steht jedenfalls:
0 5 * * * /etc/cron.aaa/daily
Ich warte mal bis morgen früh - dann weiß ich mehr.

Bisher liegen die Dumps im Webverzeichnis. Klar, muss geändert werden. Aber den Pfad und die Namen müsste schon jemand erraten.

Roland
 
Mir fallen auf Anhieb 3 Sachen ein:
- Ist das Script executable?
- Nimm mal den Space aus dem Shebang.
- Gib dem Shebang ein "-x" mit. Dann siehst du, wann genau dein Script aussteigt.
 
- das Script ist chmod 777
- das Leerzeichen ist bereits raus
- und so sollte das jetzt heißen?
#!/bin/bash -x
oder darf da auch kein Leerzeichen rein ?
 
[klugscheiss]
Am Leerzeichen liegt es definitiv nicht. Wenn die magic number einer ausführbaren Datei nicht "#!" oder 0x457f464c ist (manche Kernel verstehen auch noch a.out und java und andere Formate) startet der Kernel die Datei innerhalb der Shell /bin/sh. Da das bei Linux ebenfalls die bash ist, passiert das Gleiche, als wenn dort "#! /bin/bash" stehen würde.
[/klugscheiss]

Das Script sollte nicht den Modus 777 haben, oder willst Du dass jeder beliebige Prozess die Datei ändern kann, die Du später mit root-Rechten ausführen lässt? Das ist ein hochgradiges Sicherheitsloch!
 
Last edited by a moderator:
[OT] Man lernt nie aus... Spielt bei mir tatsächlich keine Rolle ob das Leerzeichen da ist oder nicht. Trotzdem bin ich der Meinung dass man es sich sauber ohne Leerzeichen angewöhnen sollte - nur für den Fall dass das "Fallback Bash" bewusst unerwünscht ist. [/OT]
 
Back
Top