• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Backup mit Cronjob nur teilweise!!!

noob222

Newbie
Hallo,
habe ein Script zur Datensicherung eines Systems. Wenn man es manuell ausführt, dann klappt alles wunderbar.

Da ich es natürlich automatisch haben möchte, habe ich ein Cronjob-Script erstellt. Diese wird auch ausgeführt, jedoch werden nicht alle erforderlichen Daten gesichert.

Folgendes wird manuell erstellt aber per Cronjob nicht :




Code:
# Erstellen des Datenbank-Dump-Files
exp $DB_USER/test@$SID file=$BACKUPDIR_TODAY/$DB_EXPORTFILE log=$BACKUPDIR_TODAY/$LOG_DBEXPORTFILE statistics=none compress=yes

wobei

Code:
BACKUPDIR_TODAY=$BACKUPDIR/$DATE
DB_EXPORTFILE=$SAVE_HOST"_"$DB_HOST"_"$DB_USER"_at_"$SID"_"$DATE.dmp
LOG_DBEXPORTFILE=db_export_$DATE.log

es soll also die .lgo (der dazugehörige log-Order) und die .dmp Datei erstellt werden.

wenn ich das Script manuell starte dann bekomme ich im nachhinhein eine Bestätitungsmail in der für die .dmp Datei folgendes steht



Code:
. exporting bitmap, functional and extensible indexes
. exporting posttables actions
. exporting materialized views
. exporting snapshot logs
. exporting job queues
. exporting refresh groups and children
. exporting dimensions
. exporting post-schema procedural objects and actions
. exporting statistics
Export terminated successfully without warnings.

aber wenn ich es halt mit Cronjob starte, bekomme ich diese Meldungen nicht.

Woran kann das liegen?
Kennt einer das problem??

danke
mfg
 

Nukem36

Hacker
High!

unter welchem User startest Du das Skript interaktiv? Und welchem User ist es in cron zugeordnet? Sind das dieselben User?

Nukem36
 

regexer

Advanced Hacker
Zwei Fragen:
1. Wie sieht denn der zugehörige crontab-Eintrag aus?
2. Was meinst du mit "Bestätigungsmail"? Eine E-Mail? Oder eine System-Mail an den Benutzer?
 
Cron hat nur eine "nackte" Umgebung.

Wenn du dich einloggst wird .profile oder ähnliches ausgeführt.
Dadurch ist deine Oracleumgebung eventuell nicht gesetzt.
Im Cron nicht. Weiterhin wird je nach UNIX eventuell das Script
in "sh" statt ksh oder bash ausgeführt. Dadurch geht
eventuell eine Variablenzuweisung nur über

VARIABLE=wert
export VARIABLE

und nicht wie in ksh/bash
export VARIABLE=wert.

Am einfachsten könnte gehen:
<datum> mycronscript
in:
<datum> . .profile ; ./mycronscript
( <Punkt><leerzeichen><punkt>profile ; ./mycronscript
 
OP
N

noob222

Newbie
mein eintrag in im Crontab sieht folgendermassen aus:

00 20 * * 1 /hier/der/pfad/zu/meinem/script/script.sh

Hier kann ich leider kein SHELL oder PATH definieren, weil ich folgende Fehlermeldung sonst bekomme:

Code:
SHELL=/bin/sh
crontab: error on previous line; unexpected character found in line.
PATH=/sbin:/bin:/usr/sbin:/usr/bin
crontab: error on previous line; unexpected character found in line.
crontab: errors detected in input, no crontab file generated.

woran das liegt, keine Ahnung.

Und mit Mail, meine ich eine Benachrichtigugnsmail die an mich gesendet wird, wenn das Script komplett ausgefürt wird. Diese Option steht im Script.sh
 
noob222 schrieb:
00 20 * * 1 /hier/der/pfad/zu/meinem/script/script.sh

Versuch mal:
Code:
00 20 * * 1 . .profile ; /hier/der/pfad/zu/meinem/script/script.sh
oder
Code:
00 20 * * 1 . .profile ; ksh -c /hier/der/pfad/zu/meinem/script/script.sh
 
OP
N

noob222

Newbie
Hi,

ich bekomme mit der 1.Varainte kein Ergebnis, also es passiert nix.

mit der 2. Varianten ebefalls. Kann es sein, das ich die SH-Shell benutze und nicht die ksh?

und zum Syntax noch eine Frage: hinter .profile muss ein Leerzeichen vor dem Semikolon oder muss es zusammengeschrieben werden?

wäre sehr nett von dir wenn in einem Satz sagen könntest, was diese .profile macht


PS: Ich arbeite an einer SunOS Maschine und kann ja wie oben schon beschrieben in meinem Cronjob bzw Crontab kein SHELL und PATH definieren. Ich gehe davon aus, das ich die Pfade in meinem Crontab definieren muss, damit auch die Datenbank-Dump files exportiert werden.
Aber wie gesagt, bekomme ich dies eine Fehlermeldung (siehe oben).
Das ist glaueb ich der Knackpunkt, was ich nicht lösen kann. Mir ist nicht klar warum ich so eine Fehlermeldung bekomme, wobei es doch im Netzt und auch hier im Forum beschrieben ist, das man den PATH ändern kann.

mfg
 
Beim Login wird in der Regel die Datei ".profile" ausgeführt ( für ksh/sh ).

Was für eine Shell hat dein User normalerweise ?
finger <username>
Dann siehst du die Loginshell.
Wichtig ist <punkt> <leerzeichen><"punkt"profile.
"<punkt><leerzeichen>script" sorgt dafür das script nicht als Unterprogramm aufgerufen wird, sondern dass script im Kontext
der aktuellen Shell aufgerufen wird.

Unix arbeit bei Variablen nur mit Vererbung. "Parents" kriegen/erben von
ihren Childs z.B. keine Variablen gesetzt.
=>script => rennt als Child => egal was in script mit den Variablen passier, der Aufrufer bekommt nichts mit..
=><punkt><leerzeichen>script => Da es im aktuellen Kontext läuft können Variablen geändert werden. Ist gerade für das Login wichig.

Statt <punkt><leerzeichen> geht in bash auch "source <script>".
Aber nicht auf Solaris-Cron. Dort läuft cron als "sh". Und sh kennt
source nicht.

Haveaniceday.
 
OP
N

noob222

Newbie
hi,

tut mir leid das es so lange gedauert hat bis ich wieder von dem problem berichten könnte. :-(

ok, ich mache kleine fortschritte aber es hackt da an einem problem.

hier zu dem genauen problem:

wie gesagt, klappt das script perfekt wenn ich es manuell laufen lasse und es werden die exports von der datenbank durchgeführt. mit dem cronjob allerdings nicht (sieh oben).
als fehlermeldung bekomme ich zu folgendem scriptcode eine fehlermeldung, das "exp" nicht gefunden werden kann.

Code:
# Erstellen des Datenbank-Dump-Files
exp $DB_USER/test@$SID file=$BACKUPDIR_TODAY/$DB_EXPORTFILE log=$BACKUPDIR_TODAY/$LOG_DBEXPORTFILE statistics=none compress=yes

da es sich hierbei um eine oracle datenbank handelt, befindet sich "exp" im Verzeichnis: /oracle/OraHome1/bin/exp

Da ich in meinem Cronjob kein PATH definieren kann, warum wiess ich bis jetzt noch nicht und die ganzen hilfen mit .profile usw haben leider auch nicht helfen können (siehe oben).

jetzt habe ich versucht in meinem script irgendwie diesen Pfad einzubauen, wie etwa:

Code:
# Erstellen des Datenbank-Dump-Files
/oracle/OraHOme1/bin/exp $DB_USER/test@$SID file=$BACKUPDIR_TODAY/$DB_EXPORTFILE log=$BACKUPDIR_TODAY/$LOG_DBEXPORTFILE statistics=none compress=yes

oder direkt am anfang meines scripts wo ich die ganzen Varaiblen und Pfade definiert habe :

Code:
PATH=/oracle/OraHome1/bin
.

Aber auch das leider ohne jeglichen erfolg....

Aber jetzt bekomme ich zwei Fehlermeldungen:
1. "exp" kann nicht gefunden werden
2. überprüfen sie ob ORACLE_HOME gesetzt wurde

Habe dann auch ORACLE_HOME gesetzt in meinem script. Aber wieder nichts.

Ich glaube, das das Problem gelöst werden kann, wenn man nur hinbekommt dem Script die Pfade für ORACLE_HOME und "exp" zu übergeben, damit es auch per Cronjob gefunden werden kann.

Vielleicht dazu eine Idee?

mfg
 
OP
N

noob222

Newbie
Hallo,

das Problem wurde gelöst.

Habe vergessen (bzw musste ich) in meinem Script die Pfade exportieren

Code:
ORACLE_HOME=/oracle/OraHome1
export ORACLE_HOME
PATH=$PATH:$ORACLE_HOME/bin
export PATH
 
Oben